幾種常見排序算法總結

插入排序

(教材上現拍的)左邊框框中是有序表,右邊是無序的,將右邊無序的元素挨個往左邊插入,我畫了兩張圖,遇到有序表中比自己大的,右移,直到遇到比自己小的賦值退出循環,否則繼續直到有序表中第一個

public static void insersort(int a[]) 
{    int n=a. length;
     for(i=1; i<=n-1; i++){
         x=[i];
         for(j=i-1; j>=0; j--){
             if(a[j]>x) a[j+1]=a[j];
             else break;
         }
     a[j]=x;
    }
}

選擇排序

從無序表第二個元素到最後一個元素,選出最小值,和無序表第一個元素交換

void selectSort (int a[])
{ int n=a length, jmin, amin, t,i, j;
  for(i=0; i<n; i++){
      amin=a[i]
      for(j=i+1;j<n;j++){//從a[i+1:n-1]中選取最小元素
          if(a[j]< amin)
          min=a[j]; jmin=j;
      }
  if(amin<a[i]){
//判斷、交換
      t=a[i]; a[i]=a[jmin]; a[jmin]=t;
  }
 }
}

冒泡排序

冒泡排序中數組的左邊是無序表,右邊是有序表,如果是升序,可以理解爲大泡泡往右邊移動,先是a[0]和a[1]比較,如果a[0]大於a[1]則交換,小於就不交換,然後是a[1]和a[2]比較,以此類推,無序表中最大的就會慢慢移到右邊,直到變成有序表的第一個元素,這是第一輪交換,直到全部變成有序表。

假設a={42,55,73,28,48,66,30,65,94,72}
第一輪交換後的結果:42,55,28,48,66,30,65,73,72,94
第二輪交換後的結果:42,28,48,55,30,65,66,72,73,94
第三輪交換後的結果:28,42,48,30,55,65,66,72,73,94
第四輪交換後的結果:28,42,30,48,55,65,66,72,73,94
第五輪交換後的結果:28,30,42,48,55,65,66,72,73.94

public static void bubbleSort(int a[])
{
    int i,j, t, n=a.length;
    for(i=n-1;i>=1;1--){//表示冒泡排序的輪次
    for(j=0;j<i;j++)
    //對無序表a[0:i]進行兩兩比較和交換
        if(a[j]>a[j+1]){
            t=a[j];
            a[j]=a[j+1];
            a[j+1]=t;
        }
    }
}

快速排序算法

//快速排序主算法
public static void quikSort(int A[],int l,inthH)
{
   if(l<h){
       k=divide(A,l,h);//對數組範圍A[l:h]進行劃分,k是基準值所在位置
       quikSort(A,l,k-1);//對基準值的左部A[l:k-1]劃分
       quikSort(A,k+1,h);//對基準值的右部A[k+1:h]劃分
   }
}

簡單來說,先找一個基準值(一般選第一個元素),把所有元素中小於基準值的劃到左邊,大於基準值的劃到右邊,然後重複上面操作劃分基準值左邊的元素和右邊的元素,就這樣遞歸下去

例如:49,38,65,97,76,13,27

第一趟劃分:27,38,13,49,76,97,65

第二趟劃分:13,27,38,49,65,76,97

快速排序的劃分算法如下

private static int divide(int A[],int i,int j){
    int pivotkey;
    pivotkey=A[i];
    while(i<j){
        while(i<j && A[j]>=pivotkey) //向前搜索小於pivotkey的值
            j--;
        A[i]=A[j]; 
        //i++;
        while(i<j && A[i]<pivotkey) //向後搜索大於pivotkey的值
            i++;
        A[j]=A[i];
        //j--;
     }
     A[i]=pivotkey  //或者 A[j]=pivotkey;
     return i;
  }

有一段描述過程的動態圖

 

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