快速排序的非递归形式,用栈来存储分治后的起止下标即可
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <stack>
using namespace std;
int a[100];
int partition(int a[], int i, int j){
int temp = a[i];
while(i < j){
while(i < j && a[j] >= temp)
j --;
if(i < j)
a[i ++] = a[j];
while(i < j && a[i] <= temp)
i ++;
if(i < j)
a[j --] = a[i];
}
a[i] = temp;
return i;
}
void QuickSort(int a[], int start, int end){
stack<int> s;//用栈来存储分块后的起始和终止序列
if(start < end){
int mid = partition(a,start,end);
if(mid - 1 > start){//较小的一部分
s.push(start);
s.push(mid-1);
}
if(mid + 1 < end){//大的一部分
s.push(mid+1);
s.push(end);
}
while(!s.empty()){//当栈补空的时候,进行分治
int r = s.top();//让起始终止序列出栈
s.pop();
int l = s.top();
s.pop();
mid = partition(a,l,r);
if(mid - 1 > l){
s.push(l);
s.push(mid-1);
}
if(mid + 1 < r){
s.push(mid+1);
s.push(r);
}
}
}
}
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i ++)
cin >> a[i];
QuickSort(a,0,n-1);//快速排序
for(int i = 0; i < n; i ++)
printf("%d\t",a[i]);
return 0;
}