快速排序
总的来说,是面试最常被问到的算法之一,比如百度,阿里面试就经常会被问到。
快排的平均效率总的来说是最快的排序算法,但是他也有那种最坏的情况。比如说一组数组{9,8,7,6,5,4,3,2,1}然后要排成顺序,那么他的时间复杂度就成了O(n^2)当然这个是最坏情况不会经常遇到,但是我们总要了解下。
好了 然后接下来是我个人对快排的一些简单总结:
在快排(QuickSort)中,我们一般会选出一个中轴(通常情况下我们选择数组的第一位中轴),然后在数组里面进行遍历,把比中轴小的数扔到中轴的前面,比中轴大的数扔到中轴后面,然后根据中轴,我们又分出来两个数组!(中轴以前的数,中轴以后的数,中轴已经排好序了,位置肯定不会变了,可不用管,然后一直递归调用排序,直到每一个数组都为1的长度)
描述也许有点迷糊,那让我们看下Example:
给一组数组sum[]= { 2 ,4 , 9 ,3 ,6 ,7 ,1 ,5}
我们给数组的中轴定为 第一个 2,定义个low指针指向数组第一个数2,定义一个high 指针指向数组最后一个数5,
2 4 9 3 6 7 1 5 第一步我们从high指向的数字开始,与中轴2比较,5 > 2 满足,不用变,然后high--
2 4 9 3 6 7 1 5 现在high指向1,然后1> 中轴2 不满足,然后把1往前扔,sum[ low ]=sum[ high ]
1 4 9 3 6 7 1 5 然后low+1 开始与中轴数 2比较,4 < 2,不满足,然后得扔到2的后面去 ,所以 sum[high] = sum[low] 这里的low已经是low+1 就是给sum[high] 的位置赋值4
1 4 9 3 6 7 4 5 重复第二步,第三步。比较2和7,2和6,2和3,2和9,全部大于2,满足条件,因此不变 所以次数low==high 指向 数组的第二个数
最后一步,把sum[low] = mid 也就是中轴2 ,这样一次遍历就结束了,比2大的都在2的后面,比2小的都在2的前面。
现在让我们用代码来实现下吧
public class QuicklySort {
public int getMid(int[] num,int low,int high){
int temp = num[low];
while(low < high){
while(low < high && num[high] > temp){
high--;
}
num[low] = num [high];
while(low < high && num[low] < temp){
low ++;
}
num[high] = num[low];
}
num [low] = temp;
return low;
}
public void QuickSort(int[] num,int low,int high){
if(low < high){
int mid = getMid(num, low, high);
QuickSort(num,mid+1,high);
QuickSort(num,low,mid-1);
}
}
public void sort(int[] num){
if(num.length > 0){
QuickSort(num,0,num.length-1);
}
}
@Test
public void DoSort(){
int num[] = {1,3,7,6,4,2,11};
sort(num);
for (int i = 0; i < num.length; i++) {
System.out.println(num[i]);
}
}