算法介绍
快速排序快速排序(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;
}
}