快速排序學習小結

2021-08-25 14:33:31 字數 1124 閱讀 5870

快速排序是排序演算法中平均時間複雜度為o(nlogn)的一種演算法

【問題】

對乙個序列a[1]、a[2]、……、a[n],調整序列中元素的位置,使得a[1](原序列的a[1],下同)

的左側所有元素都不超過a[1]、右側所有元素都大於a[1].

例如對序列來說,可以調整序列中元素的位置,

形成序列

【思想】two pointers

①先將a[1]存至某個臨時變數temp,並令兩個下標left、right分別指向序列首尾

(如令left=1、right=n)

②只要right指向的元素a[right]大於temp,就將right不斷左移;當某個時候

a[right]<=temp,將元素a[right]挪到left指向的元素a[left]處

③只要left指向的元素a[left]不超過temp,就讓left不斷右移;

當某個時候a[left]>temp時,將元素a[left]挪到right指向的元素a[right]處

④重複②③,直到left與right相遇,把temp(也即原a[1])放到相遇的地方

int partition(int a,int left,int right)

return 0;

}

【想要輸出給定範圍[a,b]內的隨機數】

rand()%(b-a+1)+a

[a,b]

【生成大於32767的數】

先用rand()生成乙個[0,rand_max]範圍內的隨機數

用這個隨機數除以rand_max

就會得到乙個[0,1]範圍內的浮點數

(int)((double)rand()/32767*(b-a+1)+a)

int randpartition(int a,int left,int right)

{ int p=(round(1.0*rand()/rank_max*(right-left)+left));

swap(a[p],a[left]);

int temp=a[left];

while(lefttemp)

right--;

a[left]=a[right];

while(left知識點來自於《演算法筆記》

快速排序小結

快速排序 1 基本思想 在待排序的陣列的 n 個元素中取乙個元素 一般取第乙個 將其移動到這樣的位置 在其之前的元素的值都小於它,在其之後的元素都大於它,這樣是一趟快速排序 然後對陣列的兩個部分進行同樣的操作,直到每部分只有乙個記錄為止 總之,每趟使表的第乙個元素放在適當位置,將表兩分,再對兩子表進...

排序演算法整理小結(快速排序)

說到快速排序演算法,可能我們會了解到其最壞的執行時間為o n n 但是對於其平均效能為o nlgn 正是這一點使得其被廣泛的使用,另乙個重要的特點就是,其能夠進行原地排序,能夠盡可能的減少空間的占用,盡可能的減小演算法使用的空間。說了這麼多理由,那麼到底是怎麼一回事,或者到底是怎麼樣的呢?其核心部分...

快速排序學習

快速排序利用了分治策略。分治策略可以分為3個步驟 對乙個典型的子陣列a p.r 進行快速排序的分治過程如下 快速排序的偽 如下 為了排序陣列a的全部元素,初始呼叫quicksort a,1,a.length 其中最關鍵的部分就是陣列的劃分partition,它實現了對子陣列a p.r 的原址重排。偽...