#include <iostream>
#include <stack>
using namespace std;
//快速排序
void myprintf(int *arr,int length)
{
for(int i=0;i<length;i++)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}
static int Partition(int *arr,int low,int hight)
{
if(arr == NULL || low<0 || hight < 0)
{
throw new exception("Invalid Parameters");
}
//基准
int tmp = arr[low];
while(low <hight)
{
//尾部开始找到第一个比基准小的数
while(low<hight && arr[hight]>=tmp)
{
hight--;
}
if(low == hight)
{
break;
}
else
{
arr[low] = arr[hight];
}
//从头找到第一个比基准大的数
while(low<hight && arr[low]<=tmp)
{
low++;
}
if(low == hight)
{
break;
}
else
{
arr[hight] = arr[low];
}
}
arr[low] = tmp;
return low;
}
void Quick(int *arr,int low,int hight)
{
if(low == hight)
{
return;
}
int index = Partition(arr,low,hight);
if(index > low)
{
Quick(arr,low,index-1);
}
if(index < hight)
{
Quick(arr,index+1,hight);
}
}
//用递归来解决问题
void QuickSort(int *arr,int length)
{
Quick(arr,0,length-1);
}
//用栈来模拟递归的过程
void QuickSort2(int *arr,int length)
{
if(arr == NULL || length<=0)
{
throw new exception("Invalid Parameters");
}
stack<int> vec;
int low = 0;
int hight = length-1;
int index = Partition(arr,low,hight);
if(index > low)
{
vec.push(low);
vec.push(index-1);
}
if(index < hight)
{
vec.push(index+1);
vec.push(hight);
}
while(!vec.empty())
{
hight = vec.top();
vec.pop();
low = vec.top();
vec.pop();
index = Partition(arr,low,hight);
if(index > low)
{
vec.push(low);
vec.push(index-1);
}
if(index < hight)
{
vec.push(index+1);
vec.push(hight);
}
}
}
int main()
{
int arr[]= {6,3,7,8,2,5,1,9};
myprintf(arr,sizeof(arr)/sizeof(arr[0]));
QuickSort2(arr,sizeof(arr)/sizeof(arr[0]));
cout<<"-----------------"<<endl;
myprintf(arr,sizeof(arr)/sizeof(arr[0]));
}
排序---快速排序
最新推荐文章于 2023-12-01 23:14:38 发布