演算法習題
解: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 ...