[共同学习] 快速排序浅见
作者:互联网
快速排序
参考博客
简要介绍
一种不稳定排序,采用分治的策略,是对冒泡排序的一种改进。时间复杂度O(n log2n),空间复杂度O(log2n)。
基本思想
通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据要小,然后再按此方法对这两部分数据分别进行快速排序。
实现思路
挖坑法:设置两个变量start=0,end=size-1,选择一个基准值key(如果选择第一个元素arr[start]作为基准值,key保存了arr[start]的副本,start位置就成了坑)。从end开始向前搜索,找到第一个小于key的值x,将x放入arr[start]中(end位置就成了坑),从start开始向后搜索,找到第一个大于key的值y,将y放入arr[end]中(start位置就成了坑),重复以上两步直到start==end,将key放入坑中,这时一次快排完成实现部分有序,接下来递归调用就行了。
下面这张图片和上面的思路相反,但思想一样,图片是从笔记里拿出来的,忘记当时是从哪位铁铁的博客还是哪里摘出来的了[抱拳][抱拳][抱拳]
填坑的规则就是左边有坑就从右边取值,右边有坑就从左边取值
代码实现
void QuickSort(int arr[], int left, int right){
int start = left;
int end = right;
if (start >= end)
return;
int key = arr[end];
while (start < end){
while (arr[start] < key && start < end) //start向后移动
++start;
if (start < end){
arr[end] = arr[start];
end--;
}
while (arr[end] > key && end > start) //end向前移动
end--;
if (end > start){
arr[start] = arr[end];
start++;
}
if (start == end)
arr[end] = key; //部分有序
}
arr[end] = key; //更新基准值
QuickSort(arr, left, end - 1); //递归调用
QuickSort(arr, end + 1, right);
}
–以上–
标签:arr,end,int,浅见,学习,start,key,排序 来源: https://blog.csdn.net/qq_51850970/article/details/117440544