Java快速排序实例教程:
基本思想:
快速排序是冒泡排序的改进版本,它的思想是通过一趟排序讲待排序的记录分隔成独立的两部分,其中一不分记录的关键字均小于另一部分关键字,则可以分别对这两部门记录继续进行排序 ,以打倒整个虚列的有序。
假设待排序的虚列为{L.r[s],L.r[s+1],.......,L.r[t]]} ,首先选取一个记录(通常可一选择第一个记录L.r[s])作为枢轴(或支点),然后按照下述原则重新排列其他记录,讲所有关键字较它小的记录都安置在它的位置之前,将所有关键字较它大的记录都安置在它的位置之后。由此可以该 “枢轴” 记录最后所落的位置i作为分界,将序列{L.r[s],L.r[s+1],.......,L.r[t]]} 分隔成了两个子序列{L.r[s],L.r[s+1],.......,L.r[i-1]]} 和 {L.r[i+1],L.r[s+1],.......,L.r[t]]} ,这个过程叫作一趟快速排序(或者一次划分).
一趟快速怕序的具体做法是:附设两个指针low和high,他们的初值分别为low和high,设枢轴记录的关键字为privotkey,则首先从high所指位置向前搜索找到第一个关键字小于pivotkey的记录和枢轴记录互相交换,然后从low所指向的位置起向后搜索,找到第一个关键字大于privotkey的记录和枢轴记录互相交换,重复这两步直至low==high位置.
代码一:
/** * 采用交换方式 排序 */ package 排序.交换排序; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author liuyi */ public class 快速排序 { public static void main(String[] args) throws InterruptedException { int test[] = {15,23,56,7,13,52,20,7}; new 快速排序().qSort(test, 0, test.length-1); for(int k:test) System.out.println(k); } public void qSort(int []array,int low,int high){ if(low int privot=partition(array,low,high); qSort(array,low,privot-1); qSort(array,privot+1,high); } } public int partition(int [] array,int low,int high){ /** * 选择 low位置 作为曲轴(支点) */ int pivot=array[low]; int temp=0; /** * 如果 low */ while(low /** * 先从 high端 开始判断 */ while(low=pivot) high--; /** * 进行 置换操作 */ if(low temp=array[low]; array[low]=array[high]; array[high]=temp; low++; } /** * 从 low 端判断 */ while(low /** * 进行 置换操作 */ if(low temp=array[high]; array[high]=array[low]; array[low]=temp; high--; } } return low; } } |
具体实现上述算法时候,每交换一对记录需要进行三次记录的移动(赋值)的操作,而实际上,在排序过程中对枢轴记录的赋值是多余的,因为只有在一趟排序结束时,即low==high的位置菜市枢轴记录的最后位置,由此可改写上述算法,先将记录暂时存在r[0]的位置上,排序过程中做r[low]或r[high]的单向移动,直至一趟排序后再将枢轴记录移至正确位置上.
改写代码
代码二:
/** * 改进的 快速排序 */ package 排序.交换排序; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author liuyi */ public class 快速排序_1 { public static void main(String[] args) throws InterruptedException { int test[] = {15,23,56,7,13,52,20,7}; new 快速排序_1().qSort(test, 0, test.length-1); for(int k:test) System.out.println(k); } public void qSort(int []array,int low,int high){ if(low int privot=partition(array,low,high); qSort(array,low,privot-1); qSort(array,privot+1,high); } } public int partition(int [] array,int low,int high){ /** * 选择 low位置 作为曲轴(支点) */ int pivot=array[low]; int temp=0; /** * 如果 low */ while(low /** * 先从 high端 开始判断 */ while(low=pivot) high--; /** * 进行 置换操作 */ if(low array[low]=array[high]; low++; } /** * 从 low 端判断 */ while(low /** * 进行 置换操作 */ if(low array[high]=array[low]; high--; } } array[low]=pivot; return low; } } |
相关视频
相关阅读 jdk不是有效的win32程序怎么办 jdk不是有效的win32程序解决方法java设置cookie教程 java怎么设置cookiejava怎么设置随机数 java设置随机数详细教程java怎么设置光标位置 java设置光标位置教程如何在Mac上清除Java高速缓存?如何在Mac上卸载Java?Mac上怎么卸载Java?OSX 10.11 java 6不兼容问题解决办法如何为Mac更新Java?java mac版更新教程
热门文章 JS文件中的中文在网页
最新文章
JS文件中的中文在网页关于一些Play 1.0.1资
JAVA中抽象类与接口的区别Java技巧:关于Cookie的操作JAVA AWT图形用户界面设计巧用Java将Word转换为Html网页文件
人气排行 JS文件中的中文在网页上显示为乱码解决方法怎么为Java程序添加漂亮背景图片代码JAVA AWT图形用户界面设计怎样获取java线程中信息JS简介及特点Java面向对象编程学习总结js鼠标滑过切换层效果代码下载教你java使用回调和线程处理响应全过程
查看所有0条评论>>