C++快速排序
//快速排序
void Partition(vector<int> &data, int left, int right)
{
if (right <= left)
return;
int target = data[left];
int start = left;
int end = right;
while (end > start)
{
//先从大端找起
while (end > start && data[end] >= target)
--end;
while (end > start && data[start] <= target)
++start;
//交换两个的值
if (end > start)
swap(data[start], data[end]);
}
swap(data[left], data[end]);
//进行下一次递归
int mid = end;
Partition(data, left, mid);
Partition(data, mid + 1, right);
}
至于为什么从右端先开始:在while结束时,会让target和左右指针相遇的数进行交换,因为从右向左遍历时,会在第一个小于target的数停下来,此时保证交换后的两数为升序。
快速排序的优化:三向切分
此方法适用于数组中存在大量重复的元素,为了防止重复元素进入下一层递归,影响效率
void quickSortByThree(vector<int>& nums, int left, int right)
{
if (left >= right)
{
return;
}
//定义比较点
int flag = nums[left];
//交换起始下标
int index = left;
int low = left + 1;
int high = right;
while (low <= high)
{
if (nums[low] < flag)
{
swap(nums[index++], nums[low++]);
}
else if (nums[low] > flag)
{
swap(nums[low], nums[high--]);
}
else
{
++low;
}
}
quickSortByThree(nums, left, index-1);
quickSortByThree(nums, high+1, right);
}
快排尾递归优化
void quickSort(vector<int>& nums, int low, int high)
{
int pivot;
while (low < high)
{
pivot = Partition(nums, low, high);
quickSort(nums, low, pivot - 1);
//quickSort(list,low,pivot-1); 原递归调用
//quickSort(list,pivot+1,high);
low = pivot + 1; /*尾递归*/
}
}
快排随机种子优化
void Partition(vector<int> &data, int left, int right)
{
if (right <= left)
return;
int index = rand() % (right - left) + left;
swap(data[left], data[index]);
int target = data[left];
int start = left;
int end = right;
while (end > start)
{
//先从大端找起
while (end > start && data[end] >= target)
--end;
while (end > start && data[start] <= target)
++start;
//交换两个的值
if (end > start)
swap(data[start], data[end]);
}
swap(data[left], data[end]);
//进行下一次递归
int mid = end;
Partition(data, left, mid);
Partition(data, mid + 1, right);
}