一. 实现原理
快速排序的相关知识,参考漫画:什么是快速排序?
二. 具体实现
挖坑法和指针交换法只是Partition算法实现不一样。
实现中有一点需要注意:快速排序中Partition算法总是从右边开始查找的原因
void QuickSort(int* pData, int begin, int end)
{
if (nullptr == pData || begin < 0 || end < 0) return;
if (begin >= end) return; // 只有一个节点
int pivotIdx = Partition(pData, begin, end);
QuickSort(pData, begin, pivotIdx - 1);
QuickSort(pData, pivotIdx + 1, end);
}
1. 挖坑法
int Partition(int* pData, int begin, int end)
{
int pivot = pData[begin];
int left = begin + 1;
int right = end;
int index = begin; // 空位的初始位置
while (left < right)
{
while (left < right && pData[right] >= pivot) --right; // 从右往左找第一个小于pivot的元素
if (left < right)
{
pData[index] = pData[right]; // 填空位
index = right; // 新的空位
--right;
}
while (left < right && pData[left] <= pivot) ++left; // 从左往右找以一个大于privot的的元素
if (left < right)
{
pData[index] = pData[left];// 填空位
index = left; // 新的空位
++left;
}
}
pData[index] = pivot; // 使用pivot填空位
return index;
}
2.指针交换法
int Partition(int* pData, int begin, int end)
{
int pivot = pData[begin]; // 以第一个元素作为基准值
int left = begin;
int right = end;
while (left < right)
{
while (left < right && pData[right] >= pivot) --right; // 从右往左找第一个小于pivot的元素
while (left < right && pData[left] <= pivot) ++left; // 从左往右找以一个大于privot的的元素
if (left < right) std::swap(pData[left], pData[right]);
}
if (begin != left) std::swap(pData[begin], pData[left]); // 如果右边的元素都大于等于pivot会出现right = left = begin
return left;
}