• ※交换排序(1)——快速排序(quick sort)


    快速排序使用分治策略(Divide and Conquer)来把一个序列分为两个子序列。步骤为:
    从序列中挑出一个元素,作为"基准"(pivot).
    把所有比基准值小的元素放在基准前面,所有比基准值大的元素放在基准的后面(相同的数可以到任一边),这个称为分区(partition)操作。
    对每个分区递归地进行步骤1~3,递归的结束条件是序列的大小是0或1,这时整体已经被排好序了。
    快速排序是对冒泡排序的一种改进!

    快速排序的代码如下:

    public static void quickSort(int[] numbers,int low,int high) {
    
            if(low < high) {
    
              int middle = getMiddle(numbers,low,high); 
    
              quickSort(numbers, low, middle-1);   
    
              quickSort(numbers, middle+1, high); 
    
                        }
    
        } 
    
    
    public static int getMiddle(int[] numbers, int low,int high)  {
    
        int temp = numbers[low];         
    
        while(low < high){
                //高位判断 
    
                while (low < high && numbers[high] > temp) {
    
                high--;
    
                }
    
                numbers[low] = numbers[high]; //  否则情况 numbers[high] > temp 交换位置
                 //低位判断
    
                while (low < high && numbers[low] < temp) {
    
                low++;
    
                }
    
                numbers[high] = numbers[low]; // 否则情况 numbers[low] > temp 交换位置
    
         }
    
        numbers[low] = temp ; 
    
        return low ;
    
    } 
    

    备注:
    可以采用空位法来梳理整个过程:
    比如数组ss:{4,5,7,8,6,3}
    temp = ss[0] = 4 ;
    排序开始可以认为数组为:{[],5,7,8,6,3} 首位被空出来,以空位代替。
    1)与高位比较,有两种情况:
    1.比较位上的数比temp大
    此时符合数组比较规律,则数组下标自减。
    2.比较位上的数比temp小
    则将比较位上的数放入空位。
    由于 temp =4 > ss[5] =3,将 ss[5] 放入空位,于是数组变成:{3,5,7,8,6,[]},可以认为被交换位置 ss[5] 被空出来。

    2)与低位比较,也有两种情况:与高位类似。
    1.比较位上的数比temp小
    此时符合数组比较规律,则数组下标自增。
    由于ss[0] = 3 < temp = 4 ,数组下标自增1,到ss[1],{3,5,7,8,6,[]},此时ss[1] = 5 > temp =4不再符合该判断条件!
    2.比较位上的数比temp大
    则将比较位上的数放入空位。
    由于 ss[1] = 5 > temp =4, 则将ss[1]放入空位。此时的数组排列为:{3,[],7,8,6,5}。

    在大while循环条件下,重复以上操作!最终的数组排列为:{3,[],7,8,6,5}。
    将temp的值注入其中的空位,数组的排列为:{3,4,7,8,6,5}。
    递归以上,可以将之看做为:{3},4,{7,8,6,5}
    可得到最终排序结果。

    扩展:关于快速排序与归并排序之比较?
    归并排序和快速排序都使用了分治法。
    对于归并排序,大量的工作是将两个子线性表进行归并,归并是在子线性表都排好序之后进行的。
    对于快速排序,大量的工作是将线性表划分为两个子线性表,划分是在子线性表排好序前进行的。
    在最差情况下,归并排序的效率高于快速排序,但是,在平均情况下,两者效率相同O(NlogN)。
    归并排序在归并两个子数组时,需要一个临时数组,而快速排序不需要额外的数组控件,因此,快速排序的空间效率高于归并排序。

    参考文章:http://blog.csdn.net/morewindows/article/details/6684558

    ////end

  • 相关阅读:
    2018年奇虎360春招笔试题--玫瑰花
    MaxPooling的作用
    网易笔试编程题:被3整除
    网易笔试编程题:牛牛找工作
    剑指offer 第十二天
    算法题:合并N个长度为L的有序数组为一个有序数组(JAVA实现)
    十分钟看懂神经网络反向传输算法
    十大经典排序算法最强总结(含JAVA代码实现)
    记服务器中招挖矿病毒排查过程(解决方案篇)
    spring 事件监听同时支持同步事件及异步事件
  • 原文地址:https://www.cnblogs.com/understander/p/6686372.html
Copyright © 2020-2023  润新知