java浅度解析快速排序
来源:互联网 发布:天互数据 图片 编辑:程序博客网 时间:2024/06/09 16:39
基本思想:快速排序是在冒泡排序的基础上改进而来的,它是基于分治的思想。通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使得整个数据变成有序序列。
性能分析:
快速排序的效率与划分是否对称有关,而后者又与选择哪一个元素进行划分有关。最坏情况下,时间复杂度为O(n^2),此时两个区域分别包含n-1个元素和0个元素。最好的情况下,时间复杂度为O(nlog2n)。由于快速排序是递归的,需要一个栈来存放每一层递归调用的必要信息,最大容量与递归调用的深度一致。空间复杂度最好的情况为O(log2n),最坏的情况为O(n)。平均情况下,为O(log2n)。它是一种不稳定的排序
static void quickSort(int[] a,int l,int r) { if(l<r){ int index=Partition(a,l,r);//返回的是已经经过遍历左边第一个数,将数组拆分成两个数组 quickSort(a,l,index-1);//递归遍历左边数组 quickSort(a,index+1,r);//递归遍历右边数组 } } static int Partition(int[] a,int begin,int end ) { int left=begin; int right=end; int key=a[left]; //选取一个左边第一个的为基准值 while(left<right) //从数组两端交替向中间扫描 { while(a[left]<=key)//从左边开始遍历,一直向右比较,左指针一直++,直到找到值比基准值要大就跳出while { left++;//指针往右走 } while(key<a[right])//比对左边结束之后就开始从右边遍历 ,一直往左边比较,直到找到基准值要小的数就结束while; { right--;//指针往左走 } if(left<right)//这个是理解难点,此时的左指针指向的值是比基准值大的,右指针指向的值是比基准值key小的,所以两个值要互换 { swap(a,left,right); } } a[begin]=a[right];//程序走到这里表明左指针left和右指针right已经交叉, //遍历已经结束,此时要把基准值和右指针最后指向值位置互换 a[right]=key; return right; //并且返回作为一个新的左边基准值 }
4.详细解析
①初始化int[] a={5,2,1,7,6,4,3},选定一个基准值key
②当在左循环此时left=3时指针指向的7,跳出左边循环
③程序继续往下走,来到右循环while,此时a[6]=3
阅读全文
1 0
- java浅度解析快速排序
- 快速排序解析 Java
- java 快速排序递归算法详细解析
- 快速排序算法解析
- 快速排序 解析
- 快速排序法 解析
- 快速排序算法解析
- 快速排序 解析
- 快速排序 解析
- 快速排序 解析
- 快速排序解析
- 快速排序算法解析
- 快速排序解析
- 快速排序解析
- 快速排序解析
- 快速排序-深入解析
- 快速排序,堆排序解析
- 排序-快速排序-Java
- H
- java中的文件分割和合并
- 关于发邮件报错535 Error:authentication failed解决方法
- JSP 动作元素
- 实现查找素数
- java浅度解析快速排序
- 最长不减子序列变形 The Heaviest Non-decreasing Subsequence Problem 南宁网络赛
- JS库和框架
- linux环境下python 库模块安装
- windows下TensorFlow完整安装流程及出错解决方案
- C++零碎基础知识点(一)
- Golang使用QConf教程
- Jzoj3769【NOI2015模拟8.14】A+B
- Spring框架——ioc实现原理