核心思想是利用两个指针,left和right,分别比较然后交换。注意一次快排结束后,哨兵点会在正确的位置,而左边都要小,右边都要大。随后递归。
如果用栈法,就是要记录每次子数组的位置,直到栈为空。
void QuickSortNotR(int array[],int left,int right)
{
stack<int> s;
s.push(left);
s.push(right);//后入的right,所以要先拿right
while(!s.empty())//栈不为空
{
int right = s.top();
s.pop();
int left = s.top();
s.pop();
int index = partition(array,left,right);
if((index - 1) > left)//左子序列
{
s.push(left);
s.push(index - 1);
}
if((index + 1) < right)//右子序列
{
s.push(index + 1);
s.push(right);
}
}
}
#include <iostream>
using namespace std;
int partition(int array[], int begin, int end)
{
if (begin>=end) return -1;
int left, right;
left = begin;
right = end;
int target = array[left];
while (left<right)
{
while (left<right&&array[right]>target) right--;
//每次换完值,就直接把left++,right--了,直接下一步操作免得影响
if (left<right) {array[left++] = array[right];}
while (left<right&&array[left]<target) left++;
if (left<right) {array[right--] = array[left];}
}
array[left] = target;
return left;
}
void quickSort(int array[], int left, int right)
{
int t = partition(array, left, right);
partition(array,left, t-1);
partition(array,t+1,right);
}
void print(int *array, int len)
{
for (int i=0;i<len;i++)
cout<<array[i]<<endl;
}
int main()
{
int array[5] = {5,5,3,2,1};
print(array, 5);
quickSort(array, 0, 4);
print(array,5);
return 0;
}
(栈法参考了网上代码)
2178

被折叠的 条评论
为什么被折叠?



