quick_sort新手入门
2016-09-14 23:00
309 查看
一直说要开通个博客,一直拖拖拉拉的到现在,想写点东西能给自己整理下思路,也能帮助下可爱的同学,水平有限,有不足可以指正,不喜勿喷
在java中有个叫Arrays.sort()的方法,可以为我们实现对数组的升序排序,实际上,它使用的是一种经过优化的快速排序,而快速排序是普通冒泡排序的改进。
对于一个给定的数组array,快速排序的思想是,选取其中一个元素k1作为关键字,通过一定的方法把小于k1的所有元素移动到k1的左边,大于k1的元素移动到k1的右边。
举个例子,有这样一个数组array:
57,68,59,52,72,28,96,33,24,19
假设我们选取57为k1,通过移动分为
19,24,33,52,28,57,96,72,59,68;
令S1={19,24,33,52,28},S2={96,72,59,68}
对S1,S2两个子集分别再做一次这样的操作,不断细分,最后达到每一个元素,左边的比右边的小,实现排序。
至于如何实现元素的移动,给出一个图可能更方理解,图是网上找的,画质有点模糊,不过不影响我们分析问题。
源码如下,亲测可用
在java中有个叫Arrays.sort()的方法,可以为我们实现对数组的升序排序,实际上,它使用的是一种经过优化的快速排序,而快速排序是普通冒泡排序的改进。
对于一个给定的数组array,快速排序的思想是,选取其中一个元素k1作为关键字,通过一定的方法把小于k1的所有元素移动到k1的左边,大于k1的元素移动到k1的右边。
举个例子,有这样一个数组array:
57,68,59,52,72,28,96,33,24,19
假设我们选取57为k1,通过移动分为
19,24,33,52,28,57,96,72,59,68;
令S1={19,24,33,52,28},S2={96,72,59,68}
对S1,S2两个子集分别再做一次这样的操作,不断细分,最后达到每一个元素,左边的比右边的小,实现排序。
至于如何实现元素的移动,给出一个图可能更方理解,图是网上找的,画质有点模糊,不过不影响我们分析问题。
源码如下,亲测可用
public static void quick_sort(int[] array,int left,int right){//left,right刚开始分别是57,19 if(left<right){//每次递归调用执行这一步,用于判断是否已经到了最底层 //把每一个子序列的左右游标分别赋值给零时变量,一般选取最左边的作为基准值 int i=left,j=right,referenceValue=array[left]; //在执行循环过程中,i,j的值是会更改的 while(i<j){ while(i<j && array[j]>=referenceValue){ j--; } if(i<j){ //这里其实有个很巧妙的操作,i++就是自身+1,但是自加之前进行运算 //假设原来i=3,这个语句执行的时候,i++,i瞬间变为4 //但是还是用i=3进行操作,也就是array[3]=array[j]; array[i++]=array[j]; //这个代码可以等价为array[i]=array[j];i++ } //这里是左游标往右边移动,具体过程跟上面相反 while(i<j && array[i]<referenceValue){ i++; } if(i<j){ array[j--]=array[i]; } } array[i]=referenceValue; quick_sort(array,left,i-1); quick_sort(array,i+1,right); } }以下是测试代码
public static void main(String[] argt){ int[] array={57,68,59,52,72,28,96,33,24,19}; int left=0,right=array.length-1; quick_sort(array,left,right); for(int i=0;i<array.length;i++){ System.out.println(array[i]); } }
相关文章推荐
- iOS新手入门之UIView
- MULE新手入门
- 新手快速入门Docker最新版管理工具
- CatLib新手入门---基础调用流程
- 游戏开发新手入门指导(Q&amp;A)
- quick-x 新手引导
- JAVA从菜鸟【入门】到新手【实习】一一转入第二语言Python学习“灵活学习,学练结合,经验积累”
- 新手入门:介绍JSP中request属性的用法
- css新手入门教程------纵向下拉及多级弹出式菜单
- hdu 1425 sort ---- hash入门
- 谈谈新手入门Linux
- 【新手入门】基于Cocos2d-x-2.2x 创建新项目(一)
- JAVA从菜鸟【入门】到新手【实习】一一Python制作的第一个实战项目“网络爬虫”
- 经纬财富:南京现货白银新手入门投资须知
- OGRE3D从新手到入门
- 2D高德Android地图SDK 新手入门的com.amap.api.maps.MapView的坑
- SEO系列三:周珍谈新手如何快速入门
- HTML5游戏开发引擎Pixi.js新手入门讲解
- UBUNTU一句话技巧--Linux入门(给新手)
- activiti新手入门(四)--第一个简单的请假流程的activiti项目