几种简单常见的排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25073789/article/details/79663362

    排序是最基本的算法,理解各类排序的原理,效率,复杂度有助于开拓思维,对算法有一个简单的入门!

    按平均复杂度来讲,冒泡,选择,插入的复杂度相同(On^2),也是最好理解最简单的排序方法,在生活中的应用也比较多。

    选择排序是最直观,最简单的排序方法,一句话来概括:n个数里,找最小(大)的换到最前面,对n-1,n-2...2,1(除确认是最小(大)的以外的)依次找最小的交换。

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 BubbleSort(int [] arr){

     int temp;//临时变量
     for(int i=0; i<arr.length-1; i++){   //表示趟数,一共arr.length-1次。
         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;
             }
         }
     }
 }

    插入排序 将值放到已有序数列的合适位置(一个数也可以看做有序),插入方法(将前一个有序数列长度增加,然后遍历交换),感觉本质是一样的。

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;
           }
       }
   }
}




采用分治的思想进行排序

快速排序 快速排序效率优于上面三种,程序的执行效率很重要!!! 基本思想是:以第一个值为标识  比它小的放在它左侧,大的放右侧   再分别对两侧的执行相同步骤  直到标识两侧只有一个值。

扫描二维码关注公众号,回复: 3243905 查看本文章
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);//递归调用
 }



猜你喜欢

转载自blog.csdn.net/qq_25073789/article/details/79663362