思路
给定一个待排序的序列,然后根据
枢轴把该序列分为两个可能为空的子序列,该枢轴左边的元素都小于等于枢轴的元素,该枢轴右边的元素都大于等于该枢轴的元素。
递归实现
//快速排序
int partion(int *array, int left, int right)
{
int begin = left;//标记第一个节点
int end = right;//标记最后一个节点
int key = array[end];//end是一个坑
while (begin < end)
{
while (begin < end && array[begin] <= key)//从左向右找
{
begin++;
}
array[end] = array[begin];//end坑被填,begin有一个坑
while (begin < end && array[end] >= key)//从右向左找
{
end--;
}
array[begin] = array[end];
}
array[end] = key;//end坑被填
return end;
}
void QuiteSortOne(int *array, int left, int right)
{
if (left < right)
{
int pTemp = partion(array, left, right);
QuiteSortOne(array, left, pTemp-1);
QuiteSortOne(array, pTemp + 1, right);
}
}
非递归实现
int partion(int *array, int left, int right)
{
int begin = left;//标记第一个节点
int end = right;//标记最后一个节点
int key = array[end];//end是一个坑
while (begin < end)
{
while (begin < end && array[begin] <= key)//从左向右找
{
begin++;
}
array[end] = array[begin];//end坑被填,begin有一个坑
while (begin < end && array[end] >= key)//从右向左找
{
end--;
}
array[begin] = array[end];
}
array[end] = key;//end坑被填
return end;
}
//快速排序非递归
void QuiteSort(int *array, int left, int right)
{
if (array == NULL || left < 0 || right < 0 || left >= right)
return;
stack<int> s;
int idx = 0, jdx = 0, key = 0;
s.push(right);//先压右
s.push(left);//再压左
while (!s.empty())
{
idx = s.top();//先标记左
s.pop();//左出栈
jdx = s.top();//标记右
s.pop();//右出栈
if (idx < jdx)
{
key = partion(array, idx, jdx);
if (key > idx)
{
s.push(key - 1);
s.push(idx);
}
if (key < jdx)
{
s.push(jdx);
s.push(key + 1);
}
}
}
}