排序算法-(隨機)快速排序(遞歸)


1.快速排序

  快速排序的基本思路屬於分治算法的一種,通過選擇數組中的某一個元素作為分界點(key),大於key的元素放置在數組右邊,小於key的元素放置在數組的左邊,然后通過遞歸調用該過程來實現排序算法。

  代碼如下:

int Partition(int *A, int p, int q){
  int i = p;
  int key = A[i];
  for(int j = p+1; j <= q, j++){
    if(A[j]<key){
      i++;
      int temp = A[i];
      A[i] = A[j];
      A[j] = temp; 
    }
  }
  int temp = A[i];
  A[i] = A[P];
  A[p] = temp;

  return i;
}

void QuickSort(int *A, int p, int q){
  if(p<q){
    int r = Partition(A, p, q);
    QuickSort(A, p, r-1);
    QuickSort(A, r+1, q);
  }else{
    return ;
  }
}

  代碼中主要有兩個函數Partition(int *A, int p, int q)和QuickSort(int *A, int p, int q),

  其中,Partition(int *A, int p, int q)中,指針A指向待排序的數組,p為待排序數組的起點,q為終點,函數中選用數組的起點A[p]作為分界點(key),結果該函數調用后,數組A中大於key的元素在key的右邊,小於key的元素在key的左邊。

  QuickSort(int *A, int p , int q)函數為快速排序的實現函數,通過遞歸調用每次對數組進行分界Partition操作,最終實現對數組的排序。

 

2.隨機快速排序

  在快速排序中每次對數組的分界操作Partition都是以數組的其實點作為分界點(key),這樣就帶來了一個問題——當待排序數組是一個已排好序的數組時,快速排序的執行時間是O(n平方),在執行 時間上比較耗時,於是就有了隨機快速排序的思想。

  在隨機快速排序中,每次對數組的分界操作Partition都是在數組中隨機尋找一個元素作為分界點(key),這樣就避免了上訴問題,隨機排序的平均在執行時間為O(n*lg(n))。比上面的O(n平方)有很大的提高。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM