#include<iostream>
#include<stack>
using namespace std;
void swap(int* a, int* b);
void showArray(int* a, int n);
int partition(int* a, int left, int right);
void nonRecursiveQSort(int* a, int n);
void RecursiveQSort(int* a, int left, int right);
struct range
{
int left, right;
};
int main()
{
int a[] = { 5,4,6,2,1 },len=sizeof(a)/4;
nonRecursiveQSort(a,len);
showArray(a, sizeof(a) / 4);
return 0;
}
int partition(int* a, int left,int right)
{
int randPos = rand()%(right-left+1)+left;
int low = left, high = right ,pivot;
swap(&a[low], &a[randPos]);
pivot = a[low];
while (low < high)
{
while (low < high && a[high] >= pivot)high--;
a[low] = a[high];
while (low < high && a[low] <= pivot)low++;
a[high] = a[low];
}
a[low] = pivot;
return low;
}
void nonRecursiveQSort(int* a, int n)
{
/*创建一个堆栈来保存每次partition后的两个区间的边界*/
stack<range>myStack;
range r,r1,r2;
r.left = 0;
r.right = n - 1;
myStack.push(r);
while (!myStack.empty())
{
range R = myStack.top();
myStack.pop();
int PivotPos = partition(a, R.left, R.right);
r1.left = PivotPos + 1;
r1.right = R.right;
r2.left = R.left;
r2.right = PivotPos - 1;
if (r1.left < r1.right)myStack.push(r1);
if (r2.left < r2.right)myStack.push(r2);
}
}
void RecursiveQSort(int* a, int left, int right)
{/*递归型*/
if (left < right)
{
int PivotPos = partition(a, left, right);
RecursiveQSort(a, left, PivotPos - 1);
RecursiveQSort(a, PivotPos + 1, right);
}
}
void showArray(int* a,int n)
{
for (int i = 0; i < n; i++)printf("%d ", a[i]);
}
void swap(int* a, int* b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
非递归快速排序
最新推荐文章于 2023-06-11 23:26:34 发布