目录
前言
快速排序(Quicksort),是对冒泡排序算法的一种改进。快速排序算法通过多次比较和交换来实现排序。
特点:数据越乱排序速度越快,越有序排序速度越慢。
时间复杂度最好O(nlogn) 最坏情况O(n^2) 平均时间复杂度O(nlogn)
空间复杂度O(nlogn)
稳定性:不稳定
一、排序规则
将数组内第一个元素作为我们的基准值,然后以基准值进行划分,划分出两部分,小于基准值都在基准值左边,大于基准值都在基准值右边,继续按照同样的规则去划分这两部分,直到所有的元素都放在自己合适的位置。
划分规则
1.从右向左找比基准值小的,放左边。
2.从左向右找比基准值大的,放右边
3.反复执行1.2直到left与right相遇
我们设立一组值:{6,3,2,1,9,8,7};
对其进行快速排序,如下图所示:
与冒泡排序类似,但是以基准值进行分隔后,使其对数组元素的遍历次数降低,降低了时间复杂度。
二、代码实现
//根据基准值对其进行划分,然后返回基准值所在下标
int Partition(int arr[], int left, int right)
{
int tmp = arr[left];
while (left < right)
{
//1.从右向左找,比基准值小的 放进去
while (left<right && arr[right]>tmp)
right--;
if (left == right)
{
break;
}
arr[left] = arr[right];
//2.从左向右找,比基准值大的 放进去
while (left < right && arr[left] <= tmp)
left++;
if (left == right)
{
break;
}
arr[right] = arr[left];
}
//此时left==right
arr[left] = tmp; //arr[right]=tmp;
return left;
}
void Quick(int arr[], int left, int right)
{
if (left < right)//保证left到right之间最少有两个值
{
int par = Partition(arr, left, right);
if (left < par - 1)//保证基准值左边部分最少有两个值
{
Quick(arr, left, par - 1);
}
if (par + 1 < right)//保证基准值右边部分最少有两个值
{
Quick(arr, par + 1, right);
}
}
}
void QuickSort(int arr[], int len)
{
Quick(arr, 0, len - 1);
}
总结
以上为快速排序的排序规则和代码实现,本文简单介绍了快速排序的实现,快速排序的思想可以帮助问题的分解,而且快速排序还有许多种优化方式,是值得深度思考的排序方法。