非遞迴的快速排序實現

2021-08-30 22:34:43 字數 1042 閱讀 1521

快速排序法 (quick sort)是運用分治思想(divide and conquer)對乙個陣列進行排序的比較排序演算法。它主要思想是:以某個數為軸,將這個陣列劃分成兩部分:不大於這個軸的一部分和大於這個軸的一部分;然後在分別對剩下的兩部分進行同樣的操作;一直分下去,直到每部分只有乙個元素位置為止。

如何劃分成兩部分?嚴蔚敏的《資料結構》和《演算法導論》有兩種不同的具體實現

【嚴】的描述如下:設定兩個陣列下標low,high,low從前向後移動,high從後往前移動,保證low之前的部分都是不大於軸,high之後的部分都是大於軸; 每次low找到乙個大於軸的元素,high找到乙個不大於軸的元素,交換這兩個元素的位置。如果low等於high了,則把這個位置和軸所在地位置交換。

《演算法導論》上的劃分是這樣的:也是給定兩個陣列下標i和j,i和j都從前往後移動; 保證i之前的部分都不大於軸,j之後的部分(包含j)都未知; j向後滑動中如果某個元素不大於軸,這把這個元素的位置和i交換,並且i向前移動乙個位置. 當j到達末尾後,把軸的位置與i位置上的元素交換,i即為分界點。

如何非遞迴實現?一般書上的快速排序法都是用遞迴實現的,遞迴是編譯器自動用棧來實現的。當遞迴層次比較深時,需要占用比較大的程序棧空間,還有程序棧溢位的危險。很多時候將遞迴轉化為非遞迴演算法,更省時間和空間。

其實原理很簡單,即自己用棧來模擬遞迴的過程。每次從棧頂取出一部分做劃分後,都把新的兩部分的起始位置分別入棧。

c++演算法實現如下(採用《演算法導論》上的方法):

#ifndef max_stack_depth

#define max_stack_depth 1000

#endif

template void nonrecursivequicksort(t arr, size_t size)

}//i為分界點,交換arr[i]和軸

if(i != pivot)

//判斷小於軸的部分元素如果多於乙個的話, 則入棧

if(i-low > 1)

//判斷大於軸的部分元素如果多於乙個的話, 則入棧

if(high-i > 1)

}}

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

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

快速排序非遞迴實現

再來談談快速排序,遞迴實現與非遞迴實現。遞迴實現是基本的排序 非遞迴實現需要用stack來儲存 low,high 的排序對,一部分一部分的排序。直接上程式了 標頭檔案 quick test.h include include include include include include typed...

快速排序的非遞迴實現

首先說明一下快速排序是對氣泡排序的改進。為什麼這麼說呢?想一下氣泡排序,它把序列分成了兩部分,前半部分無序,後半部分公升序排列,並且後半部分的數都大於前半部的數。由此可得到快速排序和氣泡排序的一些共同點 都要經歷n趟排序 每趟排序要經歷o n 次比較 都是後半部分元素比前半部大 而不同之處就在於氣泡...