快速排序:
即一趟快速排序的過程,返回基準。基準:平分資料段
時間複雜度:好情況(無序的資料):o(nlog2n) 壞(有序):o(n2)
空間複雜度:o(log2n)
演算法穩定性:不穩定
原理:採用分治思想,在待排序的序列中選取乙個值作為乙個基準值,按照這個基準值得大小將這個序列劃分成兩個子串行,基準值會在這兩個子串行的中間,一邊是比基準小的,另一邊就是比基準大的。這樣快速排序第一次排完,我們選取的這個基準值就會出現在它該出現的位置上。這就是快速排序的單趟演算法,也就是完成了一次快速排序。然後再對這兩個子串行按照同樣的方法進行排序,直到只剩下乙個元素或者沒有元素的時候就停止,這時候所有的元素都出現在了該出現的位置上。
例:一趟排序(以6為基準)
0 1 2 3 4 5 arr:
6 2 7 3 8 9 low=0 high=5 tmp=6
6 2 7 3 8 9 low=0 high=3 tmp=6 arr[high]=3 < tmp=6
3 2 7 6 8 9 low=0 high=3 tmp=6 arr[low]=arr[high]3
3 2 7 6 8 9 low=2 high=3 tmp=6 arr[low]=7 > tmp=6
3 2 6 7 8 9 low=2 high=3 tmp=6 arr[high]=arr[low]7 6的位置已確定
//遞迴
int partion(int *arr, int low, int high)
if (low >= high)
else
while (lowif (low >= high)
else
}arr[low] = tmp;
return low;//par基準
}void quick(int *arr, int start, int end)
if (par1)//如果右邊有兩個資料以上
}void quick_sort(int *arr, int len)
//非遞迴
void quick_sort1(int *arr, int len)
if (par1)//右邊左邊有兩個資料以上數時 入棧
while (top>0)//出棧 棧不空,需要取兩個資料出來排序
if (par1)
}free(stack);
stack = null;
}
測試:
void show(int *arr, int len)
printf("\n");
}int main()
; int len = sizeof(arr) / sizeof(arr[0]);
//quick_sort(arr, len);
quick_sort1(arr, len);
show(arr, len);
return
0;}
快速排序實現(遞迴 非遞迴)
首先是劃分演算法,假設每次都以第乙個元素作為樞軸值,進行一趟劃分 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...