Fork me on GitHub

闲来重写一下快速排序

还是写一下原理吧:

有图为证:

   

下图为原理示意图

package Alrithm;

public class Quick {
    public static void sort(int[] arr, int low, int high) {
        int min = low;// 用于动态移动角标
        int max = high;// 用于动态移动角标
        if (low < high) {// 元素大于一个才进行排序
            int temp = arr[low];// 定义基数
            while (min < max) {// 在角标重合时跳出循环
                // 新从最大值开始
                while (min < max && arr[max] > temp) {// 右边的数大于基数时,max--
                    max--;
                }
                // 减完之后在换位置
                int tmp = arr[min];
                arr[min] = arr[max];
                arr[max] = tmp;
                // 再从最小值开始
                while (min < max && arr[min] < temp) {
                    min++;
                }
                int tmp1 = arr[min];
                arr[min] = arr[max];
                arr[max] = tmp1;
            }
            sort(arr, low, min - 1);
            sort(arr, min + 1, high);
        }
    }

    public static void main(String[] args) {
        int[] arr = { 21, 32, 122, 433, 2322222, 56, 121, 565, 123 };
        sort(arr, 0, arr.length - 1);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + ",");
        }

    }
}

 如评论中所述,改进后的代码如下:

  ------在36行和42行中加入了=号-------

 1 package Alrithm;
 2 
 3 /**
 4  * 快速排序
 5  * 
 6  * @author tab
 7  */
 8 public class QuickSort {
 9     public static void main(String[] args) {
10         QuickSort qs = new QuickSort();
11         int[] arr = { 12, 232, 12, 12, 221212132, 12, 12, 233332, 12, 14442, 23552, 1244, 12, 33232, 1222, 12, 455232,
12                 432212, 14465422, 232, 12, 12, 232, 12 };
13         qs.quickSort(0, arr.length - 1, arr);
14         for (int i = 0; i < arr.length; i++) {
15             System.out.print(arr[i] + ",");
16         }
17     }
18 
19     /**
20      * 
21      * @param arr
22      *            要排序的数组
23      */
24     public void quickSort(int low, int high, int[] arr) {
25         // 思路:
26         // 2.将最左边的数的指针标记为low,将最右边的数的值栈标记为high
27         int i = low;
28         int j = high;
29         // 3.先从基数的另一边的开始和基数比较,如果该数比基数小,则角标i的表示的数和角标high表示的数交换位置,并停止,又从左边开始和基数比较
30         // <1>首先,必须是low角标小于high角标才进行比较
31         // <2>其次,在low角标和high角标相等时就停止第一轮比较
32         if (low < high) {// 一轮比较开始
33             // 1.选择一个基数,通常为左边或者右边的数
34             int base = arr[low];// 要放在if内部,因为可能出现low大于high的情况
35             while (i < j) {// 在i角标小于j角标时进行循环
36                 while (base <= arr[j] && i < j) {// 循环比较右边的数(base与arr[j]比较时还要考虑相等的情况)
37                     j--;// 如果大于基数就角标减1继续比较前一个数
38                 }
39                 // 在上面的循环结束即找到右边的数比左边小时,替换i和j角标对应的数,即时没找到,此时i和j相等,互换值也没问题
40                 swap(i, j, arr);
41                 // 同上,进行左边的数与基数的比较,小于基数则向前i++,否则互换i和j的数值,并重新开始从右边进行循环比较
42                 while (base >= arr[i] && i < j) {
43                     i++;
44                 }
45                 swap(i, j, arr);
46             }
47             // 当一轮执行完了以后使用递归,进行下一轮的比较
48             quickSort(low, i - 1, arr);
49             quickSort(i + 1, high, arr);
50         }
51     }
52 
53     public void swap(int i, int j, int[] arr) {
54         int temp = arr[i];
55         arr[i] = arr[j];
56         arr[j] = temp;
57     }
58 }

 

posted @ 2016-08-14 20:02  gouermazi  阅读(251)  评论(1编辑  收藏  举报