c語言快速排序 遞迴與非遞迴實現

2021-10-04 15:31:35 字數 1766 閱讀 6933

遞迴

1、先在待排序序列中選擇乙個基準資料,一般常用的就是第乙個資料

2、i,j : i從前向後 j從後向前 當i < j時,進入迴圈

(1)從後向前找第乙個比基準小的資料(i// 在start位置 end位置 和中間位置找到中位數,將其換到start位置

void

getmodnum

(int

*arr,

int start,

int end)

if(arr[start]

> arr[end])if

(arr[start]

> arr[mod])}

intquick

(int

*arr,

int start,

int end)

arr[start]

= arr[end]

;//小迴圈, 從前向後找第乙個比基準大的資料,儲存到end位置

while

(start < end)

arr[end]

= arr[start];}

arr[start]

= tmp;

return start;

}// arr是整個序列的起始位址,start是本次快排處理的資料的起始位置,end是本次快排處理的資料的結束位置

void

onequick

(int

*arr,

int start,

int end)

if(end - mod >1)

}void

quicksort

(int

*arr,

int len)

非遞迴非遞迴實現快速排序 – 棧 或 佇列 -> 儲存資料序列的起始位置和結束位置這一對資料

1、初始化棧或者佇列 , 初始化空間的大小為o(logn) * 2 * sizeof(int)

2、將初始的起始位置(0)和結束位置(len-1)入棧或者入佇列

3、迴圈 退出條件是:棧為空或者隊列為空

(1) 出棧或者出佇列,獲取到本次要處理的序列的起始位置和結束位置

(2)執行一次快排操作,得到到mod位置

(3)判斷mod的右邊是否還有超過1個的資料, 如果有,將右邊的起始位置和結束位置入棧或者入佇列

(4)判斷mod的左邊是否還有超過1個的資料, 如果有,將左邊的起始位置和結束位置入棧或者入佇列

*/

typedef

struct peer

peer;

typedef

struct stack

stack;

void

quicksortnor

(int

*arr,

int len)

; st.data[st.top++

]= new_peer;}if

(mod - peer.start >1)

; st.data[st.top++

]= new_peer;}}

free

(st.data)

;}

快排的優化:

1、對選擇基準的方式的優化: 隨機選擇 三位(第一位,最後一位,中間一位)取中(中位數)

2、資料量越小,資料越有序,直接插入排序的效率越高 當快排的資料量小於一定值後,直接用直接插入排序

3、對重複資料: 每次劃分將與key相等的元素集中到key的周圍,處理左邊或右邊時,這些資料不再參與

4、多執行緒並行處理

快速排序實現(遞迴 非遞迴)

首先是劃分演算法,假設每次都以第乙個元素作為樞軸值,進行一趟劃分 int partition int a,int low,int high a low pivot 將樞軸值元素置於最終位置 return low 第乙個while迴圈裡的 還可以採用如下形式 while low high a high...

快速排序遞迴與非遞迴

快速排序思想 以公升序為例 在要排序的序列中選乙個基準,使它左邊的數都比它小,右邊的數都比它大。具體步驟 1 區間選乙個key,可以選區間右邊界的那個數 2 讓begin從區間左邊界開始往後找大於key的數,找到後停下來,再讓end從區間右邊界 1開始往前找小於key的數,找到後讓它和begin找的...

快速排序 遞迴與非遞迴

1.以中間值作為基準數 void quick sort int q,int l,int r quick sort q,l,j quick sort q,j 1,r 2.以第乙個 最後乙個數作為基準數 int part sort int q,int l,int r q l q i q i temp r...