其他分享
首页 > 其他分享> > [共同学习] 快速排序浅见

[共同学习] 快速排序浅见

作者:互联网

快速排序

参考博客

白话经典算法系列之六 快速排序

简要介绍

一种不稳定排序,采用分治的策略,是对冒泡排序的一种改进。时间复杂度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