遞迴
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...