快速排序的非遞迴實現

2021-07-02 13:18:33 字數 1112 閱讀 5919

一般的快速排序是用遞迴來實現的,如何將快速排序改寫為迭代而不是遞迴?由於遞迴函式需要保護現場(在棧中),所以可以人為的構建乙個棧。

由於快速排序中處理排序是partition子函式(過程),然後將劃分範圍減小,來實現排序。所以要儲存的是待繼續排序(劃分)的邊界。這樣的乙個棧很容易自我構建。

[cpp]view plain

copy

#include 

using

namespace

std;  

//劃分子函式

intpartition(

inta,

intlow,

inthigh)  

swap(a[low],a[j]);  

return

j;  

}  //遞迴版本的qsort

void

quicksort2(

inta,

intlen)  

//非遞迴版本qsort

void

quicksor***(

inta,

intlow,

inthigh)  

if(m+1

}  }  delete

stk;  

}  //改變介面,過載的非遞迴版本

void

quicksor***(

inta,

intlen)  

if(m+1

}  }  delete

stk;  

}  int

main()  

;  for

(int

i=0;i<30;i++)  

a[i]=rand()%500;  

for(i=0;i<30;i++)  

cout<< a[i]quicksor***(a,30);  

//quicksort2(a,30);

cout<<"____________________________________"

<

for(i=0;i<30;i++)  

cout<< a[i]0;  

}  

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

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