快速排序的遞迴非遞迴

2021-08-20 18:41:31 字數 1519 閱讀 5460

快速排序:

即一趟快速排序的過程,返回基準。基準:平分資料段

時間複雜度:好情況(無序的資料):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...