Java快速排序
2016-02-29 11:23
148 查看
快速排序是一种很高效的排序算法,他通过设置选定数列一个成员作为中轴(通常就是第一个),然后将所有成员分为“大于中轴”和“小于中轴”两部分,然后分别在这两部分中再选一个中轴进行上一步的操作,以此类推,直到排序完成。在为每次分类出的 大、小 两部分选取新的中轴时,配合线程进行将成倍的提高速度,不过要注意线程的复用。
接下来解析一下快速排序的实现过程,有数组如下:
args[]={ 5、2、8、3、7、4、10、9、1、6 }
因为不想画图,我就先形容一下他的排序过程,然后在讲代码,以免太抽象
排序实现方式:
首先选出一个中轴,直接选择第一个 5
1、我们从数组最右边开始一个一个往前看,一旦找到一个比“5”小的,就停下,把这个数换到5的位置,第一次找到的当然是倒数第二个“1”,这一步完成后就是中轴5不在了,一个比“5”小的数“1”到了这个位置,而原来位置(下标[8])上的“1”变成了多余的数字
2、换个方向,在从左边开始一个一个往后找,这次找大的,一旦找到比“5”大的,就停下,把这个数放到刚刚多余出来的“1”的位置,这次找到的是8,这一步完成后,刚刚多余出的“1”被换成了“8”,那么现在“下标[2]”位置的“8”又变成了多余的数字
3、再换回右边,从第一次停下的位置”下标[8]”继续往前找,再找一个比“5”小的,然后停止,换到最后一次空余的位置[2]
4、再换左边,再找比“5”大的,然后换到右边空余的位置
………….
这样重复,最后这个空余的位置会相对推移到最中间,这个位置的左边所有的数字都是小于“5”的,而它右边所有的数字都是大于“5”的,这时还记得我们第一次就被替换的中轴“5”吗,将它放到最后空出的这个位置,就实现了一次中轴排序
而接下来要做的,就是在现在的”左“、”右“两边分别再选出一个中轴,进行和第一轮排序一样的步骤,这一轮排序完成后,左边也分成了两半, 右边也分成了两半, 把这四小份数组再来排序
一直这样排下去,最后不可分割时,整个数组就排序完成了。
下面分析主要代码,准备三个变量
1.开始第一轮顺序转移,现在目标将所有小于center的成员转移到center的左边,大于center的成员转移到右边
代码:
接下来解析一下快速排序的实现过程,有数组如下:
args[]={ 5、2、8、3、7、4、10、9、1、6 }
因为不想画图,我就先形容一下他的排序过程,然后在讲代码,以免太抽象
排序实现方式:
首先选出一个中轴,直接选择第一个 5
1、我们从数组最右边开始一个一个往前看,一旦找到一个比“5”小的,就停下,把这个数换到5的位置,第一次找到的当然是倒数第二个“1”,这一步完成后就是中轴5不在了,一个比“5”小的数“1”到了这个位置,而原来位置(下标[8])上的“1”变成了多余的数字
2、换个方向,在从左边开始一个一个往后找,这次找大的,一旦找到比“5”大的,就停下,把这个数放到刚刚多余出来的“1”的位置,这次找到的是8,这一步完成后,刚刚多余出的“1”被换成了“8”,那么现在“下标[2]”位置的“8”又变成了多余的数字
3、再换回右边,从第一次停下的位置”下标[8]”继续往前找,再找一个比“5”小的,然后停止,换到最后一次空余的位置[2]
4、再换左边,再找比“5”大的,然后换到右边空余的位置
………….
这样重复,最后这个空余的位置会相对推移到最中间,这个位置的左边所有的数字都是小于“5”的,而它右边所有的数字都是大于“5”的,这时还记得我们第一次就被替换的中轴“5”吗,将它放到最后空出的这个位置,就实现了一次中轴排序
而接下来要做的,就是在现在的”左“、”右“两边分别再选出一个中轴,进行和第一轮排序一样的步骤,这一轮排序完成后,左边也分成了两半, 右边也分成了两半, 把这四小份数组再来排序
一直这样排下去,最后不可分割时,整个数组就排序完成了。
下面分析主要代码,准备三个变量
int center=5; int small=0; int big=10; //center记录中轴的值、small记录每一次找到的小于中轴的成员下标,big用来记录每一次找到大于中轴的成员下标
1.开始第一轮顺序转移,现在目标将所有小于center的成员转移到center的左边,大于center的成员转移到右边
//将所有小于center的移到左边,大于center的移到右边 while(small<big){ //先从右向左移动下标找到一个比center小的数 while(small<big){ if(arg[big] < center){ //换位,如前面介绍交换完成arg[big]变成多余,然后停止 arg[small]=arg[big]; small++; break; } big--; } //然后从左向右移动下标找到一个比center大的数 while(small<big){ if(arg[small]>center){ //换位,如前面介绍交换完成arg[small]变成多余,然后停止 arg[big]=arg[small]; big--; break; } small++; } //结果:(原数组: 5、2、8、3、7、4、10、9、1、6) //第一次循环: 1、2、8、3、7、4、10、9、8、6 small=2,big=7 (arg[small]=8,是多余的) //第二次循环: 1、2、4、3、7、7、10、9、8、6 small=4,big=4 (arg[small]=7,是多余的) //第三次循环: small == big 循环结束 } arg[small]=center; //将最后多余的arg[small]替换为中轴 center //循环结束 结果为:1、2、4、3、5、7、10、9、8、6 //可以发现 我们选取的中轴 5 现在被转移到了中间, 且5的左边都小于5 右边都大于5 //这里模拟排序过程,代码在后面 //然后将5左右的成员用上面的方法 再进行一次排序(左边以1位中轴,右边以7为中轴) (1、2、4、3) 5 (7、10、9、8、6) //中轴“5”位置已确定 //第二次排序结果: 1 (2、4、3) 5 6 7 (9、8、10) //中轴“1”和“7”以及独立在一边的“6”位置已确定 //在进行第三次排序,左边中轴为2 右边中轴为9 // 第三次排序结果: 1 2 (4、3) 5 6 7 8 9 10 //1、2、5、6、7、8、9、10位置已确定 //进行第四次排序,左边中轴为4,右边已结束, //第四次排序结果: 1 2 3 4 5 6 7 8 9 10
代码:
import java.util.ArrayList; import java.util.List; public class QuickSort { public static void sort(int[] list, int small, int big) { if (small < big) { int center = list[small]; int left=small; int right=big; while (left < right) { //先从右开始遍历,找到一个比center大的值终止 while (left < right && list[right] > center) { right--; } list[left]=list[right]; //再从左边遍历,找到一个比center小的值终止 while (left < right && list[left] < center) { left++; } list[right]=list[left]; } //加上中轴(排序完成后将中轴的值放在最后多余出来的元素上) list[left]=center; //第二轮排序 //本次排序完成后,左边的一半数组 sort(list, small, left - 1); //本次排序完成后,右边的一半数组 sort(list, left+1, big); } } public static void main(String args[]){ int[] sortList={5,2,8,3,7,4,10,9,1,6}; sort(sortList,0,sortList.length-1); System.out.println("result:"); for(int i=0;i<sortList.length;i++){ System.out.print(sortList[i]+" "); } } }
相关文章推荐
- 【java基础】线程安全的单例模式
- 【leetcode】【34】Search for a Range
- Java内存泄露原因详解
- Java多线程学习(二)
- java 日期格式 毫秒
- 【Maven】创建一个结构清晰基于Maven的JavaWeb项目
- java日期类型转换总结date timestamp calendar string
- struts2 用form取值时出现的错误
- java 在一段英文文本中计算每个单词出现的次数
- Java字符串中“” , “ ”,和null的区别
- 线程
- java异常之Throwable源码
- Java设计模式
- 【leetcode】【33】Search in Rotated Sorted Array
- java中栈 堆 寄存器 静态变量 和常量内存解析
- Eclipse运行时提示“Failed to load the JNI shared library /Java/jre6/bin/client/jvm.dll”的一个解决方案
- java回调机制
- spring MVC4 配置详解(个人记录)
- java 中遍历hashmap 和hashset 的方法
- webservice 客户端对应xml解析