演算法習題 快速排序的非遞迴解法

2021-08-08 23:39:55 字數 854 閱讀 6782

演算法習題

解:1)用a[size]存待排序陣列,stack[m]存下標。

2)開始時stack[m]存入待排序陣列a[size]的起始下標和終止下標。

3)從stack中取出一對起始下標和終止下標,在這兩個下標區間內依次讀入a值,小於樞軸數值x的一律通過交換放在a前端。這樣就很自然地將陣列a 分成了小於x的乙個子段和大於等於x的乙個子段。

4)兩個子段中,有任何一段長度大於1,就將其起始和終止下標壓棧。

5)只要棧不空就一直執行上述操作3)4),最終就能完成乙個非遞迴的(即迭代的)快速排序演算法

**:void qsort(inta, int size)

int stack[m];

int top=-1;

stack[++top] = 0;

stack[++top] = size-1;

while (top>0)

int end = stack[top--];

int start = stack[top--];

int x = a[end];

int i = start-1;

int j = start;

for (int j = start; j < end; j++)

if (a[j] < x)

i++;

exch(a[i], a[j]);

swap(a[i+1], a[end]);

if (start < i)

stack[++top]=start;

stack[++top]=i;

if (i+2 < end)

stack[++top] = i+2;

stack[++top] = end;

快速排序非遞迴演算法

本人根據書上的三數中值快速排序修改 struct leftright inline void swap int a,int b void qsort int a,int left,int right for int m 1 0 k ma center swap a left a center if ...

快速排序 非遞迴演算法

include stdafx.h include using namespace std int myarray void printarray int array,int len printf r n int partition int s,int l,int r 從左向右找大於或等於x的數來填s...

非遞迴快速排序演算法

昨天做人人網筆試題,其中乙個就是快排非遞迴演算法,當時考慮的不全面,下面發下正確答案。先說遞迴演算法 include include using namespace std int partion int arr,int p,int r int temp arr i arr i arr p arr ...