想要變優秀,順其自然是不可能的
你需要做很多,花很多時間,忍耐并且堅持。
快速排序,簡稱快排,也是初級面試里面被問到最多的排序算法,在普通使用情況下(數據基本無序,數據量n巨大),相對于直接插入排序,簡單選擇排序,冒泡法排序,快速排序的效率都會更優。這是由冒泡排序改進的算法,也是一種基于交換排序的算法,但是不同于冒泡排序,冒泡排序每次只比較交換相鄰的兩個元素,每次只消除兩個元素之間的逆序,但是快速排序通過兩個相鄰或者不相鄰的元素的交換,能消除多個逆序,極大地加快排序的速度。
下面是每次進行冒泡排序時的模式,這個過程中,因為每次只會交換相鄰兩個元素的位置,所以只會修改這兩個元素的順序
相對于快速排序,一次可能消除多個逆序的情況,隨機選擇一個記錄anchor(一般選擇第一個元素),通過一趟排序把比anchor大的值放到右子表,比anchor小的值放到左子表,再對左右子表使用同樣的方式進行劃分,直到每個子表都只有一個元素。
對于每一趟循環,首先設定low和high指向左右兩個邊界:
1、比較右邊界high和anchor的大小,如果high大于anchor的值,那么high--,如果是小于anchor的值,那么交換anchor和high的位置,如果找到了比anchor小的值,那么到達第2步
2、比較左邊界low和anchor的大小,如果low小于anchor的值,那么low++,如果是大于anchor的值,那么交換anchor和low的位置,返回第1步
3、重復第1步和第2步,直到low == high為止。
剛好碰巧第一個元素就是整個數組最小的,這里我們也看到了,要是元素最小的話,那么效率就跟普通的冒泡排序差不多一樣了。如果我們的序列一開始就是基本有序的,快速排序算法(一次交換消除多個元素的逆序)的優勢就不明顯了。
private static int Partition(int[] num,int low,int high){
int anchor = num[low]; //用第一個元素作為anchor
//當low == high的時候退出循環
while(low <high){
// 如果anchor的值小于high,high左移
while(low <high && anchor < num[high]) high--;
num[low] = num[high];
// 如果anchor的值大于high,low右移
while(low < high && anchor >= num[low]) low++;
//當前的low值大于anchor,讓low位置的值移動anchor的位置
num[high] = num[low];
}
//跳出循環時,anchor不再移動
num[high] = anchor;
return high;
}
private static void QuickSort(int[] num,int low,int high){
if (low < high) {
//第一趟排序后anchor的位置
int index = Partition(num, low, high);
QuickSort(num, low, index - 1);
QuickSort(num, index+1, high);
}
}
算法特點
最好的情況是待排序的集合無序,最壞情況帶排序集合基本有序,平均情況下的時間復雜度為O(nlogn),空間復雜度最好情況下為O(logn),最壞情況為O(n),適用于初始記錄無序,n較大的情況。