#include<iostream>
#include<stack>
using namespace std;
//快排
int Partion(int *arr, int beg, int end)
{
if(arr==NULL)
{
exit(-1);
}
int tep = arr[beg];
while(beg<end)
{
while(beg<end&&tep<=arr[end])
{
end--;
}
if(beg<end)
{
arr[beg] = arr[end];
beg++;
}
while(beg<end && tep>=arr[beg])
{
beg++;
}
if(beg<end)
{
arr[end] = arr[beg];
end--;
}
}
arr[beg]=tep;
return beg;
}
void QuickSort(int *arr , int beg, int end)
{
if(arr==NULL)
{
return;
}
if(beg<end)
{
int mid = Partion(arr , beg , end);
QuickSort(arr , beg , mid-1);
QuickSort(arr , mid+1, end);
}
}
//非递归快排,其实就用一个栈保存每次的Partion()的返回值,
void _QuickSort(int *arr , int beg, int end)
{
stack<int> s;
if(beg<end)
{
int mid = Partion(arr , beg , end);
{
if(beg<mid-1)
{
s.push(beg);
s.push(mid-1);
}
if(mid+1<end)
{
s.push(mid+1);
s.push(end);
}
}
}
while(!s.empty())
{
int q = s.top();
s.pop();
int p = s.top();
s.pop();
int mid = Partion(arr , p, q);
if(p<mid-1)
{
s.push(p);
s.push(mid-1);
}
if(mid+1<q)
{
s.push(mid+1);
s.push(q);
}
}
}
int main()
{
int arr[] = {9,8,7,6,5,4,3,2,1,89,78,9999,8};
int len = sizeof(arr)/sizeof(arr[0]);
_QuickSort(arr, 0 , len-1);
for(int i=0;i<len;++i)
{
cout<<arr[i]<<" ";
}
cout<<endl;
return 0;
}
递归和非递归快排
最新推荐文章于 2024-06-05 13:43:32 发布