快速排序遞迴與非遞迴

2021-07-11 02:11:43 字數 1898 閱讀 3352

快速排序思想:以公升序為例;在要排序的序列中選乙個基準,使它左邊的數都比它小,右邊的數都比它大。具體步驟:1、區間選乙個key,可以選區間右邊界的那個數;2、讓begin從區間左邊界開始往後找大於key的數,找到後停下來,再讓end從區間右邊界-1開始往前找小於key的數,找到後讓它和begin找的大的數交換;3、begin繼續找大的,end繼續找小的,如果begin和end相遇了,那麼比較相遇點的數和key的大小,若大於key,就讓相遇點的數和key交換,返回相遇點,否則返回區間右邊界。

while (begin < end && array[end] >= key)//找到小的

swap(array[begin], array[end]);

}//相遇且相遇點的值大於key

if (array[begin]>key)

//相遇但相遇點的值小於key

else

}void sectionsort(int *array,int left, int right)

}void quicksort(int *array, size_t size)

優化:三數取中,保證每次的key值不是最大的或最小的

int getmiddleindex(int *array,int left, int right)

else

else

}}int partsort(int *array, int left, int right)

while (begin < end && array[end] >= key)//找到小的

swap(array[begin], array[end]);

}//相遇且相遇點的值大於key

if (array[begin]>key)

//相遇但相遇點的值小於key

else

} void sectionsort(int *array, int left, int right)

else

}}void quicksort(int *array, size_t size)

快速排序非遞迴:

用棧來儲存區間,劃分區間相當於一棵二叉樹,第一次整個區間排序,那麼把整個區間看做二叉樹的根節點,key值會劃分出左右區間,相當於左右子樹,將左右區間壓棧,迴圈取棧頂區間排序,並把新分出來的區間壓棧,直到棧為空,迴圈結束,全部區間都已排好序。整個過程可以看做二叉樹的深度遍歷。

}//每次的區間範圍壓棧,取棧頂區間partsort,並繼續劃分區間壓棧,相當於深度擴充套件樹節點

void quicksort2(int *array, size_t size)

if (right>mid + 1)

}while (!s.empty())

if (right>mid + 1)}}

快速排序 遞迴與非遞迴

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

快速排序 遞迴與非遞迴

快速排序演算法,簡稱快排,是最實用的排序演算法,沒有之一,各大語言標準庫的排序函式也基本都是基於快排實現的。快排基本思路 快速排序基本思想是 通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可...

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

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