快排的思路可以参考文章:http://developer.51cto.com/art/201403/430986.htm
下面是我的递归和非递归实现。
递归实现:
int nums[100];
void qsort(int left,int right){
if(left > right) return;
int temp = nums[left];
int i=left,j=right;
while(i!=j){
while(nums[j]>=temp && j>i) j--;
while(nums[i]<=temp && i<j) i++;
if(i<j){
int t = nums[j];
nums[j] = nums[i];
nums[i] = t;
}
}
nums[left] = nums[i];
nums[i] = temp;
qsort(left,i-1);
qsort(i+1,right);
}
非递归实现:
#include<iostream>
#include<stack>
using namespace std;
void qsort(int * nums,int length){
if(nums ==NULL || length <=0) return;
stack<int> cstack;
int left = 0;
int right = length -1;
cstack.push(left);
cstack.push(right);
while(!cstack.empty()){
right = cstack.top();
cstack.pop();
left = cstack.top();
cstack.pop();
int i = left;
int j = right;
int temp = nums[i];
while(i<j){
while(i <j && nums[j]>=temp) j--;
while(i <j && nums[i]<=temp) i++;
if(i<j){
int t = nums[i];
nums[i] = nums[j];
nums[j] = t;
}
}
nums[left] = nums[i];
nums[i] = temp;
if(i-1>left){
cstack.push(left);
cstack.push(i-1);
}
if(i+1<right){
cstack.push(i+1);
cstack.push(right);
}
}
}
int main(){
int nums[]={4,3,5,6,1,2};
int length = sizeof(nums)/sizeof(int);
cout<<"before sort:";
for(int i=0;i<length;i++) cout<<nums[i]<<" ";
cout<<endl;
qsort(nums,length);
cout<<"after sort:";
for(int i=0;i<length;i++) cout<<nums[i]<<" ";
cout<<endl;
}