快速排序和隨機化快排學習

2022-05-09 04:12:07 字數 1721 閱讀 8677

0.基本思想

選定基準值(通常為當前陣列的第乙個元素),經過一系列比較和交換,將比基準值小的放在其左邊,將比基準值大的放在其右邊,這稱為是一次迴圈。

#include using

namespace

std;

void qsort(int arr, int low, int

high)

}/*從右向左找比key小的值

*/while (arr[--j] >key)

}if (i >= j) break

;

/*交換i,j對應的值

*/int temp =arr[i];

arr[i] =arr[j];

arr[j] =temp;

}/*中樞值與j對應值交換

*/int temp =arr[low];

arr[low] =arr[j];

arr[j] =temp;

qsort(arr, low, j - 1

); qsort(arr, j + 1

, high);

}int

main()

; qsort(a,

0, sizeof(a) / sizeof(a[0]) - 1);/*

這裡原文第三個引數要減1否則記憶體越界

*/for(int i = 0; i < sizeof(a) / sizeof(a[0]); i++)

return0;

}

**:非常好的一篇博文! 

//

快速排序

public

static

void quicksort(int a, int left, int

right) }//

快速排序陣列劃分

private

static

int partition(int a, int left, int

right)

}swap(a, p+1

, right);

return p+1

;}

精髓:p指向的是比基準元素(這裡選取的是最右元素)小的最後乙個的元素位置。最後p+1的位置就是right的最終的位置。

如果if判斷語句改為了》,那麼就是只有在a[i]比基準元素大的時候才會被調整到前面,就是大在前,從大到小排序了。

博文中給的例子也很好。

//

快速排序的隨機化版本,除了呼叫劃分函式不同,和之前快排的**結構一模一樣

public

static

void randomquicksort(int a, int left, int

right) }//

隨機化劃分

public

static

int randompartition(int a, int left, int

right)

因為在陣列有序的時候,如果只選擇最右作為基準,快排就退化為選擇排序,複雜度o(n^2)。快排平均時間複雜度是o(nlogn),對於每乙個元素都是排左和排右。所以這裡的改進策略是隨機選取基準元素,就可以得到平衡的劃分。

上面博文中給了測試結果,在隨機化的序列中,普通快排相較於隨機化更快一點,因為後者多了生成隨機數與交換的過程。

但是在已經排好序的序列中,隨機化是碾壓級別的!

應用:215. 陣列中的第k個最大元素

隨機化快速排序

define max size 100 include include using namespace std 交換指標p1,p2指向的值 void exchange int p1,int p2 pa為指向a的陣列,p,r為下標,對a p.r 進行就地重排,以a r 為主元 劃分為小於主元和大於主元...

隨機化的快速排序

快排是所有排序演算法中平均效能最好的一種排序,雖然它的最壞的情況和氣泡排序一樣是 n 2。但是平均來說為o n logn 現在研究生又開始學演算法了,主要是隨機演算法,分布式演算法,和概率演算法。第一節課講的是隨機化的快速排序,但是我覺得當n比較小的時候不適合隨機演算法,因為隨機的過程也在花費時間,...

快速排序之隨機化

快速排序的思想就是選擇乙個基準數,讓每個數與它比較,找到它在所有這些數排好序後應該在的位置。而快速排序對大體應經排好序的數執行效率是n 2,所以對基準數隨機化,以下 include include using namespace std 產生m到n的隨機數 int random int m,int ...