文章流程:
思路——代码——分析——改进
【思路】
排序过程:
快排是制分的思路,首先将一个随机的元素放在数组中本该存在的位置,然后将小于该元素的放在左面,大于该元素的放在右面。
partition过程:
对于数组[l...r]每次选取最左面的元素arr[l],声名两个指针i,j,i用于遍历数组,j用于存放小于arr[l]的元素,范围是[l+1...j]。
【代码】
public class Main{
public static void main(String[] args){
int arr[] = {...};
quickSort(arr,arr.length);
}
public static void quickSort(int[] arr,int n){
quickSort(arr,l,r);
}
public static void quickSort(int[] arr,int l,int r){
if(l>=r)
return ;
int index = partition(arr,l,r);
quickSort(arr,l,index-1);
quickSort(arr,index+1,r);
}
//将l位置的元素放在[l...r]数组该在的位置
public static int partition(int[] arr,int l,int r){
int ele = arr[l];
int i = l+1;
int j = l;//[l+1...j]存放小于ele的元素 ,[j+1...r]存放大于等于ele的元素
//5 4231 769 32459834
while(i<=r){
if(arr[i]<ele){
swap(arr,j+1,i);
j++;
}
i++;
}
swap(arr,l,j);
return j;
}
}
【分析】
1、快排的时间复杂度与partition过程有关,每次选取arr[l]作为partition的元素,最坏的情况下可能会是O(n*n),为了保证其平均的时间复杂度,一般选取随机的元素作为partition的对象,平均时间复杂度为O(nlgn)。空间复杂度是O(lgn)。
2、快排本身是不稳定的排序。
【改进】
1、排序过程中迭代到底的判断语句可以在剩余少量元素的时候使用插入排序
2、出现大量的重复元素可以使用两路快排或者三路快排