幾種簡單常見的排序

    排序是最基本的算法,理解各類排序的原理,效率,複雜度有助於開拓思維,對算法有一個簡單的入門!

    按平均複雜度來講,冒泡,選擇,插入的複雜度相同(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;
           }
       }
   }
}




採用分治的思想進行排序

快速排序 快速排序效率優於上面三種,程序的執行效率很重要!!! 基本思想是:以第一個值爲標識  比它小的放在它左側,大的放右側   再分別對兩側的執行相同步驟  直到標識兩側只有一個值。

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);//遞歸調用
 }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章