快速排序

基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

举例(填坑法)

  算法描述:给定一个数组array,有6个元素,i表示数组开始下标i=0,j表示数组的最大下标,j=5.

首先选择一个数字作为基数,然后先最后一个数字与基数比较,当数字大于基数时,再选择倒数第二位与基数比较,直到遇到一个数字比基数小(如果没有遇到说明这个序列已经排好了),将这个数字赋值给基数那个位置(array[0]),同时i+1,然后从i+1的开始与基数比较,如果数字小于基数,i右移,直到遇到比基数大的数字,把当前数字赋值个array[j],

循环执行上面两步(一次左移结束和一次右移结束为一个循环),

i右移和j左移的过程中始终保持i<j,当i=j时这一轮比较结束,产生两个待排序的序列 下标0->i-1 和下标 i+1->5,递归执行上面的步骤。

  待排序列  6  2  7  3  9  8

  选择一个数字作为基数,这里选择6 :   

  x  2  7  3  9  8  (x代表坑)  i = 0     j = 5   <---

  先从右往左分别与6比较,当遇到3的时候,  3 <  6;用3填坑,原来3的位置变成了坑

  3  2  7  x  9  8   左移结束  i = 1   j = 3     右移

  3  2  x  7  9  8   右移结束        i = 2    j = 3 - 1   i = j   用基数6填坑

  3  2  6  7  9  8   此时 6左边的数字都比6小,有边上的数字都比6大,

  于是产生了两个序列需要排序【3, 2】【7, 9 ,8】,对这两个序列用上面的方法排序。

  

public class QuickSort {
    public int[] sort(int[] array, int start, int end){
        int i = start;
        int j = end;
        int base = array[start];
        while (i != j){
            while (array[j] >= base && j > i){
                j--;
            }
            if (i < j){
                array[i] = array[j];
                i++;
                while(array[i] <= base && i < j){
                    i++;
                }
                if (i < j){
                    array[j] = array[i];
                }
            }
        }
        array[i] = base; //基数填坑

        if (start < i - 1){
            sort(array, start, i - 1);
        }
        if (j + 1 < end){
            sort(array, j + 1, end);
        }
        return array;
    }

    public static void main(String[]args){
        QuickSort quickSort = new QuickSort();
        int[] arr = new int[]{3, 7,4,6,9,2,5};
        arr = quickSort.sort(arr,0,arr.length - 1);
        for (int i : arr
             ) {
            System.out.println(i + ",");
        }
    }
}

 

  

 

posted @ 2019-02-15 20:46  jac_f  阅读(96)  评论(0)    收藏  举报