快速排序的过程java
来源:互联网 发布:sql server2008免费版 编辑:程序博客网 时间:2024/05/16 09:29
快速排序是一种效率比较高的算法。但是在网上学习的时候,发现很多解释和算法的实际过程对不上,所以呢自己细心研究了一下过程,供初学者参考。
一般的做法是选取数组最左端的数字为key,也就是比较的对象,将比key小的放到它的左边,比key大的放到它的右边,然后对左边和右边分别进行相同的做法。比如看这个例子,我们要排序的数组是{3,4,7,9,2},首先将最左边的3作为key,第一步想要得到结果是把小于3的数字,也就是2,放到3的左边,把大于3的,也就是4,7,9,放到3的右边,4,7,9这三个数字的顺序无所谓(见Fig.1)。第一次用,不知道怎么调图片大小,见谅。
实现的方法是:有左右两个指针,left和right,left对应数组最左端的数字,right对应数组最右端的数字(见Fig.1)。首先从右端看起,因为右端是要放比3大的数字,所以碰到比3小的数字我们要移动到左边,比如,right对应的是2,我们要把它移到左边去,那么移到哪个位置呢,就是left现在所在的位置,移动后的数组就变成了Fig.2所示。
网上一般的写法是交换3和2的位置,变成{ 2,4,7,9,3 },但实际上代码过程里并没有体现交换的过程,那么3去哪里了呢,不要急,3还在key那里呢,最后赋值就会回来了。这里实现的代码是array[left]=array[right]。接下来,我们从左端看起,寻找比3大的数,left移到了4所在的位置(见Fig.3)
那么我们要把4移到右边去,移到哪里呢,移到现在right的位置,就变成了Fig.4所示
然后再看,右边,因为right所对应的数字要比3小,而4>3,right左移一位,9大于3,再左移,7大于3,再左移,当left和right相遇的时候,我们就不用进行下去了,因为left是从左往右移动的,将对应的大于3的数字移到了右边,所以left左边的都是小于3的数字,而right右边都是大于3的数字,所以此时只要将我们的key,也就是3,放在现在right的位置就行了,也就是将right对应的4变为3,所以就变成了{2,3,7,9,4},这就是我们想要的结果。
第一步完了之后,接下来就是递归了,和很多的文章都是一样的,我们将3左边的,也就是{2},和右边的,也就是{7,9,4},分别重复同样的方法,2就一个数,不用排,右边的{7,9,4},把7作为key,右边的4小于7,要放到左边,变为了{4,9,4},left往右移动,9大于7,放到右边,变为了{4,9,9},然后left和right相遇,将key的值放进去,就变成了{4,7,9},到这里再递归分下去左右都是一个数,就不用排了,于是得到了我们想要的结果{2,3,4,7,9}。程序在最后面。
package PaiXu;public class KuaiSuPaiXu { public static void main(String[] args){ int [] array =new int[]{3,4,7,9,2}; for(int i=0;i<array.length;i++){ System.out.print(array[i]+" "); } KuaiSuPaiXu a=new KuaiSuPaiXu(); System.out.print("\n"); a.sort(array, 0, array.length-1); for(int j=0;j<array.length;j++){ System.out.print(array[j]+" "); } }//固定切分public static int partion(int[] array ,int left, int right){int key =array[left];while(left<right){while(array[right]>=key&&right>left){right--;}array[left]=array[right];//将右边小于key的放到左边while(array[left]<=key&&right>left){left++;}array[right]=array[left];//将左边大于key的放到右边}array[right]=key;return right;}public void sort(int[] array, int left,int right){if(left>=right){return;}int index=partion(array,left,right);sort(array,left,index-1);sort(array,index+1,right);}}
- 快速排序的过程java
- c++快速排序的过程
- 快速排序过程的优化
- JAVA的快速排序
- Java的快速排序
- 快速排序过程的优化(续)
- 快速排序算法的算法过程
- 快速排序的java版
- 快速排序的JAVA实现
- 快速排序的Java实现
- java写的快速排序
- 快速排序的java实现
- 快速排序的java实现
- 快速排序的java实现
- 快速排序Java的实现
- java实现的快速排序
- 快速排序的JAVA实现
- 快速排序的java实现
- 动画(Animation)来回变换
- java语言编写链表的基本操作(链表的创建,插入,删除,打印,排序)
- jedis选择redis的某个数据库
- 双大于运算法则
- 第二十七节JSP
- 快速排序的过程java
- 堆栈操作合法性
- 字符流中第一个不重复的字符
- 安装Linux 操作系统
- Spring框架学习之一(组件的使用)
- Java学习第九天
- 2017.9.28
- IntelliJ IDEA实用快捷键
- LinuxStudyNote(31)-Linux常用命令(7)-网络命令(2)traceroute、netstat