递归快速排序的思想:
1.选择任何一个数作为基准数,找到这个基准数的位置
2.基准数一侧的数大于另一侧的数,对两侧进行排序,这是分治的思想
//递归算法:
#include<stdio.h>
void main(){
int i,num[6]={3,1,2,6,8,9};
for(i=0;i<6;i++)
{
printf("%d ",num[i]);
}
int partition(int array[],int left,int right);
void quick_sort(int array[],int left,int right);
quick_sort(num,0,5);
for(i=0;i<6;i++)
{
printf("%d ",num[i]);
}
}
int partition(int array[],int left,int right)
{
int temp;
temp = array[left];
while(left < right)
{
while(temp<array[right]&&left < right)
right--;
if(left < right)
array[left++]=array[right];
while(temp > array[left] && left < right)
left++;
if(left < right)
array[right--]=array[left];
}
array[left] = temp;
return left;
}
void quick_sort(int array[],int left,int right)
{
if(left<right)
{
int part = partition(array,left,right);
quick_sort(array,left,part-1);
quick_sort(array,part+1,right);
}
}
//非递归快速排序的思想:用栈,递归是用系统的栈来保存函数的参数。
#include<iostream>
#include<stack>
using namespace std;
int partition(int array[],int left,int right)
{
int temp;
temp = array[left];
while(left < right)
{
while(temp<array[right]&&left < right)
right--;
if(left < right)
array[left++]=array[right];
while(temp > array[left] && left < right)
left++;
if(left < right)
array[right--]=array[left];
}
array[left] = temp;
return left;
}
void quick_sort_noncur(int array[],int l,int r)
{
if(l>r)
return;
stack<int> s;
int mid= partition(array,l,r);
if(l < mid)
{
s.push(l);
s.push(mid-1);
}
if(mid+1<r)
{
s.push(mid+1);
s.push(r);
}
while(!s.empty())
{
int max = s.top();
s.pop();
int min = s.top();
s.pop();
mid=partition(array,min,max);
if(min < mid-1)
{
s.push(min);
s.push(mid-1);
}
if(mid+1<max)
{
s.push(mid+1);
s.push(max);
}
}
}
void main()
{
int i,num[6]={3,1,2,6,8,9};
for(i=0;i<6;i++)
{
printf("%d ",num[i]);
}
quick_sort_noncur(num,0,5);
for(i=0;i<6;i++)
{
printf("%d ",num[i]);
}
}