博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
排序算法总结--快速排序
阅读量:4204 次
发布时间:2019-05-26

本文共 1137 字,大约阅读时间需要 3 分钟。

前面说的冒泡排序是一种交换排序。交换排序还有一种算法,就是快速排序算法。

快速排序的核心思想是分而治之。意思就是选出一个基准(可以是第一个元素,也可以是最后一个。为了方便我们选取第一个),将小于这个基准的全部元素都放在这个基准的左边,大于这个基准的全部元素都放在基准的右边。然后分别对左右两个数组在进行同样的操作。这里我们就可以用到递归。也就是说我们每次进行上述操作后,都可以得到一个相对有序的数组。通过不断缩小范围,就会得到一个个小的有序数组。然后这个些数组组合起来就可以得到一个完整的有序数组。

直接撸代码(代码实现多种多样)

//分治的思想,以数组首个元素为基准元素,小于基准的放到左边,大于基准的放在右边,然后将基准数归位void quicksort(int a[],int start, int end) {    int i, j, t, base;    if (start>= end)    	return;    base= a[start]; //base中存的就是基准数    i = start;    j = end;    while (i != j)     {     	while (a[j] >= base&& i < j)	    	j--;    	while (a[i] <= base&& i < j)//再找左边的    		i++;    	if (i < j)//交换两个数在数组中的位置    	{    		t = a[i];    		a[i] = a[j];        	a[j] = t;    	}    }    //最终将基准数归位    a[start] = a[i];    a[i] = temp;    quicksort(a,start, i - 1);//继续处理左边的,这里是一个递归的过程    quicksort(a,i + 1, end);//继续处理右边的 ,这里是一个递归的过程    return;}

复杂度分析

时间复杂度并不好分析,因为快速排序的时间复杂度和选取的元素有关。当然也和数组本身元素的次序有关。平均来说,时间复杂度是O(nlogn)。

空间复杂度:算法本身只是用到了一个临时变量,可以看做不需要额为的空间。但是用到了递归,所以有栈的开销。空间复杂度为O(nlogn)。

适用场景分析:

可以看出,快速排序的时间复杂度是比较低的。所以即使数据量较大,快速排序也能hold住。但是要注意,如果本身数组已经是基本有序的,而且是倒序的,快速排序就退化成冒泡排序了,时间复杂度就变成O(n^2)了。所以当适合数据量大,待排序数组乱序程度高的时候,用快速排序是比较合适的。

转载地址:http://euali.baihongyu.com/

你可能感兴趣的文章
Android 获取assets的绝对路径
查看>>
Android 启动tomcat报错
查看>>
Android Studio导入项目太慢解决方法
查看>>
Android 之ButterKnife注解使用
查看>>
Android notifyDatasetChanged失效
查看>>
Android 报错 content.res.Resources$NotFoundException
查看>>
解决intellij idea新建maven项目,加载archetype模型很慢
查看>>
ASCII、Unicode和UTF-8的区别
查看>>
浅析python 中__name__ = '__main__' 的作用
查看>>
Python 日志模块logging使用总结
查看>>
Python学习笔记(二) 之 错误,调试,测试
查看>>
Python学习笔记(三) 之 IO编程
查看>>
一台电脑同时运行多个tomcat配置方法
查看>>
使用IntelliJ IDEA创建Maven管理的Web项目
查看>>
Nginx + Tomcat 配置负载均衡集群
查看>>
Python学习笔记(四) 之进程和线程
查看>>
Genymotion报错An error occured while deploying the file
查看>>
在Windows的CMD中如何设置支持UTF8编码
查看>>
Python中操作mysql的pymysql模块详解
查看>>
Markdown 语法
查看>>