美文网首页
排序算法

排序算法

作者: 林几许 | 来源:发表于2022-05-09 14:30 被阅读0次

    冒泡排序

    思想:两两比较,冒出一个值继续比较,最终把最小或则最大值放到末尾或开头,剩下的循环比较
    优化可加一个布尔值,可以省略最后一轮比较

    public static void BubbleSort1(int [] arr){
    
       int temp;//临时变量
       boolean flag;//是否交换的标志
       for(int i=0; i<arr.length-1; i++){   //表示趟数,一共 arr.length-1 次
    
           // 每次遍历标志位都要先置为false,才能判断后面的元素是否发生了交换
           flag = false;
           
           for(int j=arr.length-1; j>i; j--){ //选出该趟排序的最大值往后移动
    
               if(arr[j] < arr[j-1]){
                   temp = arr[j];
                   arr[j] = arr[j-1];
                   arr[j-1] = temp;
                   flag = true;    //只要有发生了交换,flag就置为true
               }
           }
           // 判断标志位是否为false,如果为false,说明后面的元素已经有序,就直接return
           if(!flag) break;
       }
    }
    

    选择排序

    思想:选取第一个值跟其余值比较,选择一个最大或则最小值放到开头,依次循环

    public static void select_sort(int array[],int lenth){
    
       for(int i=0;i<lenth-1;i++){
    
           int minIndex = i;
           for(int j=i+1;j<lenth;j++){
              if(array[j]<array[minIndex]){
                  minIndex = j;
              }
           }
           if(minIndex != i){
               int temp = array[i];
               array[i] = array[minIndex];
               array[minIndex] = temp;
           }
       }
    }
    

    插入排序

    思想:先选择前面两个值比较,把最小值放前面,相当于把前面两个值的大小排列好,用把第三个值拿来跟前面排序好的比较,放到自己合适的位置,依次循环

    public static void  insert_sort(int array[],int lenth){
    
       int temp;
    
       for(int i=0;i<lenth-1;i++){
           for(int j=i+1;j>0;j--){
               if(array[j] < array[j-1]){
                   temp = array[j-1];
                   array[j-1] = array[j];
                   array[j] = temp;
               }else{         //不需要交换
                   break;
               }
           }
       }
    }
    

    希尔排序(对插入排序的优化)

    思想:在插入排序的基础上,根据某一增量对数组分成子序列,分别进行插入排序,跟随增长越来越小,最后到1时,即完成排序

    public static void shell_sort(int array[],int lenth){
    
       int temp = 0;
       int incre = lenth;
    
       while(true){
           incre = incre/2;
    
           for(int k = 0;k<incre;k++){    //根据增量分为若干子序列
    
               for(int i=k+incre;i<lenth;i+=incre){
    
                   for(int j=i;j>k;j-=incre){
                       if(array[j]<array[j-incre]){
                           temp = array[j-incre];
                           array[j-incre] = array[j];
                           array[j] = temp;
                       }else{
                           break;
                       }
                   }
               }
           }
    
           if(incre == 1){
               break;
           }
       }
    }
    

    快速排序

    思想:先把数组中的数值拿出一个当作key,然后把剩下的数值拿出来跟key比较,大于等于的放一边,小的放另一边,然后对于分开的两个部分重复上一个操作,到最后区间只剩一位为止。
    **辅助理解:[挖坑填数]
    例:【70,25,60,90,45】从小到大排序,
    i=0,j=4,key=70
    把70拿来当key,a[0]的位置空了,
    先从j位置开始往前找小于70的: 发现a[4]小于70,a[0]=a[4],i++,j--,a[4]空出来
    再从i位置往后找大于等于70的: 发现a[3]大于70,a[4]=a[3],i++,j--,a[3]空出来
    此时i=2,j=2,【45,25,60,空,90】
    因为i=j=3,a[3]又是空的,那把70放到a[3],即【45,25,60,70,90】
    再把70左边三个进行循环,【45,25,60】
    i=0,j=2,key=45
    a[0]=a[1].i++,j--,a【1】空,因为i=1=j,a[1]=45

    public static void quickSort(int a[],int l,int r){
         if(l>=r)
           return;
    
         int i = l; int j = r; int key = a[l];//选择第一个数为key
    
         while(i<j){
    
             while(i<j && a[j]>=key)//从右向左找第一个小于key的值
                 j--;
             if(i<j){
                 a[i] = a[j];
                 i++;
             }
    
             while(i<j && a[i]<key)//从左向右找第一个大于key的值
                 i++;
    
             if(i<j){
                 a[j] = a[i];
                 j--;
             }
         }
         //i == j
         a[i] = key;
         quickSort(a, l, i-1);//递归调用
         quickSort(a, i+1, r);//递归调用
     }
    

    相关文章

      网友评论

          本文标题:排序算法

          本文链接:https://www.haomeiwen.com/subject/muhhurtx.html