小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

快速排序及其分析

 Gavin-book 2011-10-03

前言


快速排序的平均情況下是O(nlogn),但是一般都比其他運行時間為O(nlogn)的算法都要快,因為它隱藏的常數(shù)因子比較小,但是在最壞情況之下,快速排序的運行時間是O(n2)。


快速排序過程


快速排序采用的思想是分治思想,就像合并排序算法的思想一樣,合并排序算法是從數(shù)組的中間開始分治,直到分為N個分組,最后分別合并N個分組的解。如下圖,有原始數(shù)組A = {1, 3, 4, 5, 7, 2, 6, 8, 0}




快速排序是找出一個元素(理論上可以隨便找一個)作為基準(zhǔn)(pivot),然后對數(shù)組進行分區(qū)操作,使基準(zhǔn)左邊元素的值都不大于基準(zhǔn)值,基準(zhǔn)右邊的元素值都不小于基準(zhǔn)值,如此作為基準(zhǔn)的元素調(diào)整到排序后的正確位置。遞歸快速排序,將其他n-1個元素也調(diào)整到排序后的正確位置。最后每個元素都是在排序后的正確位置,排序完成。所以快速排序算法的核心算法是分區(qū)操作,即如何調(diào)整基準(zhǔn)的位置以及調(diào)整返回基準(zhǔn)的最終位置以便分治遞歸。


基準(zhǔn)


基準(zhǔn)的挑選會影響到算法的性能,一般情況將序列的第一個元素作為基準(zhǔn)。


分區(qū)算法


設(shè)兩個指針left和right,一個從左往右掃描,一個從右往左掃描;對于左指針,如果左指針?biāo)傅脑氐闹敌∮诨蛘叩扔诨鶞?zhǔn)值,那么指針往右移一位,如果大于基準(zhǔn)值,則和基準(zhǔn)值交換;同理,對于右指針,如果右指針?biāo)傅脑氐闹荡笥诨蛘叩扔诨鶞?zhǔn)值,那么指針往左移一位,如果小于基準(zhǔn)值,則和基準(zhǔn)值交換。代碼如下:


  1. int Partition(int A[], int p, int r)  
  2. {  
  3.     int privot = A[p];  //基準(zhǔn)   
  4.     // 設(shè)兩個指針   
  5.     int left = p;   //從左往右掃描   
  6.     int right = r;  //從右往左掃描   
  7.       
  8.     while (right > left)  
  9.     {  
  10.         while (right > left && A[right] >= privot)    
  11.         {  
  12.             right--;  
  13.         }  
  14.   
  15.         A[left] = A[right];  
  16.   
  17.         while (right > left && A[left] <= privot)  
  18.         {  
  19.             left++;  
  20.         }  
  21.   
  22.         A[right] = A[left];  
  23.     }  
  24.   
  25.     A[left] = privot;  
  26.     return left;  
  27. }  
  28.   
  29. void QuickSort(int A[], int p, int r)  
  30. {  
  31.     int pivot;  
  32.   
  33.     if (r > p)  
  34.     {  
  35.         pivot = Partition(A, p, r);  
  36.         QuickSort(A, p, pivot-1);  
  37.         QuickSort(A, pivot+1, r);  
  38.     }  
  39. }  


 

性能分析


最好情況


每次基準(zhǔn)的最終位置都是在數(shù)組中間位置,從而使規(guī)模為N的問題分為2個規(guī)模為N/2的問題,即T(n) = 2T(n/2) + Θ(n),用遞歸樹分析或者主定理得到時間T(n) = O(nlogn)。


最壞情況


每次基準(zhǔn)的最終位置都是第一個位置,從而規(guī)模為N的問題分為一個規(guī)模為N-1的問題,即T(n) = T(n-1) + Θ(n),用遞歸樹分析可得運行時間T(n) = O(n2)。


平均情況


假設(shè)規(guī)模為N的問題分為一個規(guī)模為9/10N的問題和規(guī)模為1/10N的問題,即T(n) = T(9n/10) + T(n/10) + Θ(n),用遞歸樹分析可得T(n) = O(nlogn),而且比分區(qū)9:1要更平均(也就是情況更好)的概率為80%,所以在絕大部分情況下快速排序算法的運行時間為O(nlogn)。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多