快速排序的非遞迴實現

2021-09-10 12:00:22 字數 3031 閱讀 4392

data mining,nlp,search engine

首先說明一下快速排序是對氣泡排序的改進。為什麼這麼說呢?想一下氣泡排序,它把序列分成了兩部分,前半部分無序,後半部分公升序排列,並且後半部分的數都大於前半部的數。

由此可得到快速排序和氣泡排序的一些共同點:

都要經歷n趟排序

每趟排序要經歷o(n)次比較

都是後半部分元素比前半部大

而不同之處就在於氣泡排序的交換操作發生相鄰的元素之間,即一趟排序可以要經過多次交換操作;快速排序的交換操作發生在間隔比較遠的兩個元素之間,一趟排序要經過交換操作次數會少一些。

下面給出快速排序的遞迴和非遞迴實現**:

?#include

#include

#include

#include

#include

usingnamespacestd;

/**把陣列分為兩部分,軸pivot左邊的部分都小於軸右邊的部分**/

template<typenamecomparable>

intpartition(vector&vec,intlow,inthigh)

//此時low==high

vec[low]=pivot;

returnlow;

}

/**使用遞迴快速排序**/

template<typenamecomparable>

voidquicksort1(vector&vec,intlow,inthigh)

}

/**使用棧的非遞迴快速排序**/

template<typenamecomparable>

voidquicksort2(vector&vec,intlow,inthigh)

data mining,nlp,search engine

首先說明一下快速排序是對氣泡排序的改進。為什麼這麼說呢?想一下氣泡排序,它把序列分成了兩部分,前半部分無序,後半部分公升序排列,並且後半部分的數都大於前半部的數。

由此可得到快速排序和氣泡排序的一些共同點:

都要經歷n趟排序

每趟排序要經歷o(n)次比較

都是後半部分元素比前半部大

而不同之處就在於氣泡排序的交換操作發生相鄰的元素之間,即一趟排序可以要經過多次交換操作;快速排序的交換操作發生在間隔比較遠的兩個元素之間,一趟排序要經過交換操作次數會少一些。

下面給出快速排序的遞迴和非遞迴實現**:

?#include

#include

#include

#include

#include

usingnamespacestd;

/**把陣列分為兩部分,軸pivot左邊的部分都小於軸右邊的部分**/

template<typenamecomparable>

intpartition(vector&vec,intlow,inthigh)

//此時low==high

vec[low]=pivot;

returnlow;

}

/**使用遞迴快速排序**/

template<typenamecomparable>

voidquicksort1(vector&vec,intlow,inthigh)

}

/**使用棧的非遞迴快速排序**/

template<typenamecomparable>

voidquicksort2(vector&vec,intlow,inthigh)

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

首先是劃分演算法,假設每次都以第乙個元素作為樞軸值,進行一趟劃分 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 次比較 都是後半部分元素比前半部大 而不同之處就在於氣泡...