快速排序(Quick sort)

基本思想 将一个将要排序的数据分割成独立的两部分,其中的一部分的所有数据都要比另外一部分的所有数据要小。之后再对这两部分分别继续递归地执行相同的方式直到排序完成。

如果快速排序处在最坏情况下的话,其时间复杂度和冒泡排序相同。O(n2)

平均的性能而言,其查找速度的时间复杂度为O(nlogn),是处在几种排序算法中效率最高的。


其采用的核心思想 分治法

1 问题分解为规模更小的子问题。

2 这些子问题逐个击破。

3 将解决掉的子问题合并最终得出问题的解。


分治法和递归经常同时应用在算法的设计中。



算法原理 将要排序的数组中任意选取一个数据(通常是数组的第一个数),将比此数小的放到其左边,然后再将比其大的数放置其右边。然后对得出的左右两个结果再继续重复执行此算法直到全数组排序完成。


具体实现方式  1 取出对比值(一般为数组的第一个值) 

                        2 先从数组的后边往前遍历寻找比对比值小的数,找到的话将找到的数的位置和对比值对换。

                        3 从数组的前边往后遍历寻找比对比值大的数,找到的话将找到的数的位置和对比值对换。

                        4 将数组内的值全部对比一次从而根据对比值分出两个部分。

                        5  之后再对分出的两个部分在进行第一步到第四步的操作。


C语言代码实现如下


void quickSort(int *array, int left, int right) {
	// 对数组的所有元素进行过一次排序后,最后其左右坐标或者相等
	if (left >= right) {
		return;
	}

	int i = left;
	int j = right;
	int pivot = array[left];

	while (i < j) {
		// 寻找结束的条件 找到一个大于pivot的数
		// 如果左坐标等于右坐标的时候,证明对数组的所有元素进行过完了一次排序
		while (i < j && pivot <= array[j]) {
			// 向前寻找
			j--;
		}

		a[i] = a[j];

		// 寻找结束的条件 找到一个小于pivot的数
		// 如果左坐标等于右坐标的时候,证明对数组的所有元素进行过完了一次排序
		while (i < j && pivot >= array[i]) {
			// 向后寻找
			i++;
		}
		a[j] = a[i];
	}

	// 当最后 i = j 的时候,证明数据的一次全元素和pivot的比较完成
	// 将对比的pivot值放到最后空出来的那个位置
	array[i] = pivot;

	quickSort(array, left, i - 1);
	quickSort(array, i + 1, right);
}

int array[6] = {1, 5, 8, 2, 10, 3};
quickSort(array, 0, 6 - 1);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值