基本思想
1.先从数列中取出一个数作为基数
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边
3.再对左右区间重复第二步,直到各区间只有一个数
这就是挖坑填数的基本思路
下面我写一下实现步骤总结
1. i = L, j = R,将基准数挖出后形成第一个坑a[i]
2. j--由后向前找比它小的数,找到后挖出此数填到前一个坑a[i]中
3. i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中
4. 再重复执行2、3两步,知道i == j,将基准数填入a[i]中
下面给出具体实现代码
//快速排序
//稳定性 不稳定
//时间复杂度 O(nlogN)
//空间复杂度 O(lgN)
//Hoare版本
int Partition_01(int *array, int left, int right)
{
int begin = left;
int end = right;
while (begin < end)
{
//begin<end
while (begin < end && array[begin] <= array[right])
{
begin++;
}
while (begin < end && array[end] >= array[right])
{
end--;
}
Swap(&array[begin], &array[end]);
}
Swap(&array[begin], &array[right]);
return begin;
}
//挖坑法
int Partition_02(int *array, int left, int right)
{
int begin = left;
int end = right;
int temp = array[right];
while (begin < end)
{
while (begin < end && array[begin] <= temp)
{
begin++;
}
array[end] = array[begin];
while (begin < end && array[end] >= temp)
{
end--;
}
array[begin] = array[end];
}
array[begin] = temp;
return begin;
}
//前后指针法
int Partition_03(int *array, int left, int right)
{
int cur, div;
for (cur = left, div = left; cur < right; cur++)
{
if (array[cur] < array[right])
{
Swap(&array[cur],&array[div]);
div++;
}
}
Swap(&array[div], &array[right]);
return div;
}
void _QuickSort(int *array, int left, int right)
{
if (left > right)
{
return;
}
if (left == right)
{
return;
}
int div = Partition_03(array, left, right);
_QuickSort(array, left, div - 1);
_QuickSort(array, div + 1, right);
}
void QuickSort(int array[], int size)
{
_QuickSort(array, 0, size - 1);
}