//左右指针法void LRPoint(int* arr, int left, int right)
{
if (left >= right)
return;
assert(arr);
int begin = left;
int end = right;
int key = arr[end];
while (begin < end)
{
while (begin < end && arr[begin] <= key)
begin++;
while (begin < end && arr[end] >= key)
end--;
if (begin < end)
swap(arr[begin], arr[end]);
}
//begin end指向一起,与key交换
swap(arr[begin], arr[right]);
LRPoint(arr, left,begin - 1);
LRPoint(arr, begin+1,right);
}
void NRQuickSort(int* arr, int sz)
{
assert(arr);
stack<int> s;
int left = 0;
int right = sz;
s.push(right);
s.push(left);
while (!s.empty())
{
left = s.top();
s.pop();
right = s.top();
s.pop();
if (left < right)
{
int begin = left;
int end = right;
int key = arr[right];
while (begin < end)
{
//1,5,6,2,7,4while (begin < end && arr[begin] <= key)
begin++;
while (begin < end && arr[end] >= key)
end--;
if (begin < end)
swap(arr[begin], arr[end]);
}
swap(arr[begin], arr[right]);
s.push(right);
s.push(begin + 1);
s.push(begin - 1);
s.push(left);
}
}
}
快速排序初步了解:快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。后面将提供一种快排的优化方式可以尽量避免出现Ο(n2)的复杂度。基本思路1.先从数据当中找出一个数据作为参照数2.然后开始分区操作,大于参照数的就放到参照数右边,小于参照数的就放到参照数的左边.3.然后对左右分区继续进行该操