快速排序

 

算法介绍

快速排序快速排序(Quicksort)是对冒泡排序的一种改进。快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

详解

对于一个长度大于1的数组arr,我们取其中一元素作为基准值,为了方便我们默认取arr[0].

那么,我们就可以将数组中比arr[0]大的元素,放置在arr[0]的左边;比arr[0]大的放在arr[0]的右面.(升序)

例如:

[3,4,8,1,2,90,45,0,-123]    //3为基准值
​
[1,2,0,-123,3,4,8,90,45]    //整理后
​

但这样远远不能使数组元素按升序排列,不过只要我们对基准值左右两面的子数组重复上述操作,最终数组就会排好序.

列入:

[1,2,0,-123,3,4,8,90,45]    //取1为[1,2,0,-,123]的基准值,4为[4,8,90,45]的基准值
​
[0,-123,1,2,3,4,8,90,45]    //整理后
​
[0,-123,1,2,3,4,8,90,45]    //取0为[0,-123]的基准值;[2]的长度等于1,不再操作,[4]同理;取8为[8,90,45]的基准值
​
[-123,0,1,2,3,4,8,90,45]    //整理后
​
[-123,0,1,2,3,4,8,90,45]    
​
[-123,0,1,2,3,4,8,45,90]
​

代码实现:

python:

def quicksort(array):
  if len(array) < 2:
    return array  #基线条件:为空或只包含一个元素的数组是“有序”的
  else:
    pivot = array[0]  #递归条件
    less = [i for i in array[1:] if i <= pivot]  #由所有小于基准值的元素组成的子数组
    greater = [i for i in array[1:] if i > pivot]  #由所有大于基准值的元素组成的子数组
    return quicksort(less) + [pivot] + quicksort(greater)

java:

public static <T> ArrayList<T> quickSort(ArrayList<T> arr) {
        if(arr.size()<2) {
            return arr;
        }else {
            T t=arr.get(0);
            ArrayList<T> less = new ArrayList<T>();
            ArrayList<T> greater = new ArrayList<T>();
            for(int i=1;i<arr.size();i++) {
                if(((Comparable)t).compareTo((Comparable)arr.get(i))>=0) {
                    less.add(arr.get(i));
                }else{
                    greater.add(arr.get(i));
                }
            }
            ArrayList<T> art = new ArrayList<T>();
            
            art.addAll(quickSort(less));
            art.add(t);
            art.addAll(quickSort(greater));
            return art;
        }
}

 

点赞