[算法基础]快速排序
来源:互联网 发布:一淘和淘宝联盟哪个 编辑:程序博客网 时间:2024/05/16 00:34
快速排序的基本思想是:每轮排序将数列分成2段,左边段的数字都比右边段的要小,以此再递归排序这2个子数列,直到数列完全有序。
思路
将数列第一个数字定为key,第一位和最后一位的位置定义为浮标(I和K)
从K开始从后往前逐个与key对比,直到找出比key小的值,将该值赋值到key的位置
(现在K指向的位置空出来了)从I开始从左到右逐个与key对比,直到找出比key大的值,将该值填补上K指向的位置(I指向的位置空出来了)
循环2、3两步,遍历所有数字,直到I==K,将key的值放到I指向的位置,完成一轮排序。(这一步完成后,key的左边数字都比它小,而右侧数字都比它大)
一轮排序循环的推演
现有数列int[] array = {2,5,4,1,7,3}
key定为第一位的2 {2,5,4,1,7,3},定义第二位和尾部位置为浮标,分别为i和k。
key = 2, i = 0, k = 5
从尾部K位置开始,依次倒序与key比较,找出符合
array[k] < key
的值(即1<2),将array[k]赋值给array[i]。 结果:{1,5,4,1,7,3}。
目前i=1, k=3
。下面,array[k]需要一个比key大的数来填补从左边I+1位置开始,向右寻找比key大的数字,
array[i]>key
,找到2<5,将5放到1原来的位置上:{1,5,4,5,7,3}。
i对应的位置空出,需要寻找符合array[k]<key
的值来填补,目前i=1, k=3
从k-1位置开始寻找比key小的值,直到
k==i=1
,本轮排序结束,将key放到该位置上array[i]=key
,即{1,2,4,5,7,3}
现在形成以I和K为分界的左右两边子数列,{1} 和{4,5,7,3},分别再对这2个子序列做同样的处理,最后达到有序。
实现
static void quickSort(int[] array, int start, int end){ if(start < end){ int i = start, k = end; int key = array[i]; while (i < k){ while(i < k && key <= array[k]){//查找比key小的右区的值 k--; } if(i < k) array[i] = array[k]; //把key的位置赋值给比它小的k,k的位置空出 while(i < k && key > array[i]) //查找比key大的左区的值 i++; if(i < k) array[k] = array[i]; //将i赋值给k,i空出来了 } array[i] = key; quickSort(array, start, i-1); quickSort(array, i+1, end); } }
- 基础算法 快速排序
- 基础算法----快速排序
- 基础算法-快速排序
- 基础算法-快速排序
- 算法基础 快速排序
- [算法基础]快速排序
- 基础排序算法-快速排序
- 基础算法-快速排序算法
- 基础算法--C快速排序
- 算法基础--快速排序详解
- 算法基础之排序篇-快速排序
- 【算法基础】【排序】快速排序 - Quick Sort
- 基础算法之排序--快速排序
- 基础算法--排序:之快速排序
- 算法基础之排序—快速排序
- Java算法基础之快速排序算法
- Java算法基础之快速排序算法
- java 算法基础~快速排序算法
- Python学习系列:函数式编程
- 测试
- JavaScript之DOM
- 三维重建面试8:点云图像的滤波方法
- 【Docker容器的数据管理】- 数据卷的使用-为容器添加数据卷
- [算法基础]快速排序
- 从零开始学_JavaScript_系列(46)——Proxy代理(给对象加壳)
- 隐匿行踪(最短路)
- C++操作符重载及实现简单的复数类Complex
- tentakel 修改集群时间
- static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
- 点、线、边缘检测
- lxc container 用户名和密码
- java大数值与数组