[算法基础]快速排序

来源:互联网 发布:一淘和淘宝联盟哪个 编辑:程序博客网 时间:2024/05/16 00:34

快速排序的基本思想是:每轮排序将数列分成2段,左边段的数字都比右边段的要小,以此再递归排序这2个子数列,直到数列完全有序。

思路

  1. 将数列第一个数字定为key,第一位和最后一位的位置定义为浮标(I和K)

  2. 从K开始从后往前逐个与key对比,直到找出比key小的值,将该值赋值到key的位置
    (现在K指向的位置空出来了)

  3. 从I开始从左到右逐个与key对比,直到找出比key大的值,将该值填补上K指向的位置(I指向的位置空出来了)

  4. 循环2、3两步,遍历所有数字,直到I==K,将key的值放到I指向的位置,完成一轮排序。(这一步完成后,key的左边数字都比它小,而右侧数字都比它大)

一轮排序循环的推演

现有数列int[] array = {2,5,4,1,7,3}

  1. key定为第一位的2 {2,5,4,1,7,3},定义第二位和尾部位置为浮标,分别为i和k。
    key = 2, i = 0, k = 5

  2. 从尾部K位置开始,依次倒序与key比较,找出符合array[k] < key的值(即1<2),将array[k]赋值给array[i]。 结果:{1,5,4,1,7,3}。
    目前i=1, k=3下面,array[k]需要一个比key大的数来填补

  3. 从左边I+1位置开始,向右寻找比key大的数字,array[i]>key,找到2<5,将5放到1原来的位置上:{1,5,4,5,7,3}。
    i对应的位置空出,需要寻找符合array[k]<key的值来填补,目前i=1, k=3

  4. 从k-1位置开始寻找比key小的值,直到k==i=1,本轮排序结束,将key放到该位置上array[i]=key,即{1,2,4,5,7,3}

现在形成以I和K为分界的左右两边子数列,{1} 和{4,5,7,3},分别再对这2个子序列做同样的处理,最后达到有序。

实现

static void quickSort(int[] array, int start, int end){        if(start < end){            int i = start, k = end;            int key = array[i];            while (i < k){                while(i < k && key <= array[k]){//查找比key小的右区的值                    k--;                }                if(i < k)                    array[i] = array[k]; //把key的位置赋值给比它小的k,k的位置空出                while(i < k && key > array[i]) //查找比key大的左区的值                    i++;                if(i < k)                    array[k] = array[i]; //将i赋值给k,i空出来了            }            array[i] = key;            quickSort(array, start, i-1);            quickSort(array, i+1, end);        }    }