快速排序是排序演算法中平均時間複雜度為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 的原址重排。偽...