Java快速排序

来源:互联网 发布:程序员的修炼之道 pdf 编辑:程序博客网 时间:2024/06/13 10:44

           快速排序的基本思想非常简单:首先我们从数据列中任意选一个数据P(基准值)。然后,我们把比P大的的值和比P小的值分离出来,得到新的数据列S1和S2,虽然新的数据列未见得是顺序的,但是P的位置,在整个数据列中,就可以确定下来也就是S2PS1。然后以同样的方式,在S2和S1中递归,那么整个数据列最终就会成为有序数据列。如图所示。


    

  算法步骤:

1.选出指定的分界值P

2.将所有比分界值大的元素放在左边

3.将所有比分界值小的元素放在右边

步骤1非常简单,步骤2和3的实现是难点。

而这个时候就要用到交换了,这也是理解快速排序的核心。

具体思路如下

(1).定义一个变量i,从左边的第一个角标开始,用来记录大于P的值。

(2.)定义一个变量j,从右边的角标(实际上就是S2PS1的最后一个角标),用于记录比P小的元素。

(3)如果i<j,那么交换i、j两个索引处的元素。


重复执行以上(1),(2),(3).当i>=j的时候,可以判断P左边的元素S2都比P小,P右边的元素S2都比P大。 最后将分界值P和j索引处的元素交换即可。


public class QuickSort3 {public static void main(String[] args) {int[] data = new int[] { 9, -16, 21, 23, -30, -47, 21, 30, 13 };printArray(data);quickSort(data);printArray(data);}public static void swap(int[] data, int i, int j) {int temp = data[i];data[i] = data[j];data[j] = temp;}public static void quickSort(int[] data) {subSort(data, 0, data.length - 1);}public static void printArray(int[] data) {System.out.print("[");for (int i = 0; i < data.length; i++) {if (i != data.length - 1) {System.out.print(data[i] + ",");} else {System.out.println(data[i] + "]");}}}public static void subSort(int[] data, int start, int end) {if (start < end) {int base = data[start];// 确定临界值pint i = start;// i记录比P大的值int j = end + 1;// j记录比P小的值while (true) {while (i <end && data[++i] - base <= 0); // 当循环结束的时候,表示i角标处的值,比标准值小while (j > start && data[--j] - base >= 0); // 当循环结束的时候,表示j角标处的值,比标准值大 这个时候要交换,不符合要求才交换,符合要求就不交换嘛.if (i < j) {swap(data, i, j);} else {break;}}swap(data, start, j);  //将P和data[j]交换,subSort(data, start, j);subSort(data, j + 1, end);}}}
[9,-16,21,23,-30,-47,21,30,13][-47,-30,-16,9,13,21,21,23,30]







原创粉丝点击