快速排序的基本思想:
快速排序(Quicksort)是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比key值小,另外一部分的所有数据都比key值大,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序的整体思路:
void QuickSort(DataType* a, int left, int right)
{
assert(a);
if (left >= right)
return;
int div = PartSort1(a, left, right);//一趟排序之后key值的位置
QuickSort(a, left, div - 1);//对小于key的部分进行快排
QuickSort(a, div+1, right);//对大于key的部分进行快排
}
单趟排序的三种方法:
1.左右指针法
2.挖坑法
3.前后指针法
三种方法都先以最后一个元素为key值
左右指针法:
begin从左往右找,找到比key大的停下来;
end从右往左找,找到比key小的停下来;
swap(&a[begin],&a[end]);
当begin和end相遇时,swap(&a[begin],&a[right])。算法如下:
int PartSort1(DataType* a, int left, int right)//左右指针法
{
//int mid = GetMidNum(a, left, right);
//Swap(&a[mid], &a[right]);
DataType key = a[right];
int begin = left, end = right;
while (begin < end)
{
while (begin < end && a[begin] <= key)
{
begin++;
}
while (begin < end && a[end] >= key)
{
end--;
}
Swap(&a[begin], &a[end]);
}
Swap(&a[begin], &a[right]);
return begin;
}
挖坑法
算法如下:
int PartSort2(DataType* a, int left, int right)//挖坑法
{
//int mid = GetMidNum(a, left, right);
//Swap(&a[mid], &a[right]);
DataType key = a[right];
int begin = left;
int end = right;
while (begin < end)
{
while (begin < end&&a[begin] <= key)
{
++begin;
}
a[end] = a[begin];
while (begin < end&&a[end] >= key)
{
--end;
}
a[begin] = a[end];
}
a[begin] = key;
return begin;
}
- 前后指针法:
算法如下:
int PartSort3(DataType* a, int left, int right)//前后指针法
{/*
int mid = GetMidNum(a, left, right);
Swap(&a[mid], &a[right]);*/
int prev = left - 1;
int cur = left;
while (cur < right)
{
if (a[cur] < a[right] && ++prev != cur)
{
Swap(&a[cur], &a[prev]);
}
++cur;
}
Swap(&a[++prev], &a[right]);
return prev;
}
- 关于key值选择的优化
int GetMidNum(DataType* a, int left, int right)
{
assert(a);
int mid = left + ((right - left) >> 1);
if (a[left] < a[mid])
{
if (a[mid]>a[left])
return mid;
else if (a[left] < a[right])
return right;
else
return left;
}
else
{
if (a[mid]>a[right])
return mid;
else if (a[right] > a[left])
return left;
else
return right;
}
}
要用优化的key值只需要将代码内的注释代码放开即可。
测试代码:
void TestQuickSort()
{
DataType a[] = { 2, 5, 6, 9, 8, 3, 1, 0, 7, 4 };
QuickSort(a, 0, sizeof(a) / sizeof(DataType)-1);
PrintfBuff(a, sizeof(a) / sizeof(DataType));
}