快速排序 優化與總結

2021-09-23 02:47:07 字數 1580 閱讀 7916

基礎快排

快排的基本框架就是下邊這樣。更魯棒一點的話,還需要考慮傳入的array是否是非法引數。

此處優化:應當將陣列,打亂順序,如果陣列基本有序,快排的時間複雜度將退化到

應該在傳入sort之前就將陣列 shuffle。

public static void sort(int array,int lo ,int hi)

if(lo>=hi)

int index=partition(array,lo,hi);

sort(array,lo,index-1);

sort(array,index+1,hi);

}

shuffle

public static void shuffle(int a)

}

完整測試快排過程

public static void main(string args) ;

int len = a.length;

shuffle(a);

sort(a,0,len-1);

for (int i = 0; i < len; i++)

}

重點是 partition

《演算法》第四版給的partition如下:

​ 存在問題,當數字僅有乙個數字的時候,a[++i]越界了。並不魯棒,所以使用這個之前需要單獨處理陣列只有乙個數字的測試。

public static int partition(int a,int lo,int hi)

swap(a,lo,j);

return j;

}

較為魯棒的寫法(而且不使用swap 進行交換)

public static int partition(int a,int lo,int hi)

array[lo]=array[hi];

while(array[lo]<=key&&hi>lo)

array[hi]=array[lo];

}array[hi]=key;

return hi;

}

上面方法避免了陣列僅有乙個數字的時候的越界問題,但是不夠優化,因為我們預設選lo 作為我們的樞值,然後進行劃分的。

進一步優化的方法是,樞值的選取應該也是隨機的。這個隨機是在lo~hi之間隨機選乙個來進行。

public static int partition(int a,int lo,int hi)

a[lo] = a[hi];

while(a[lo] < key && hi > lo)

a[hi] = a[lo];

}a[hi] = key;

return hi;

}

最優化的方法是 :三數取中間的數 來當 基準點

public int partition(int a,int lo,int hi)

a[hi] = key;

return hi;

}

排序比較與總結

之前一共實現了6種比較常見的排序演算法,分別是 選擇排序,插入排序,氣泡排序,歸併排序,快速排序,堆排序 效率 衡量乙個演算法的效率包括空間和時間,有時候還要考慮穩定性。前3種排序的方法效率較低,實現也比較簡單,適合規模比較小的排序,個人認為適合排序總量在10000以下的隨機數組。後3種排序的方法效...

氣泡排序改進與總結

5 改進的氣泡排序 從小到大排序 void bubblesort int array int n if 0 exchange return 如果某遍沒有交換,說明已經排序好。6 氣泡排序的穩定性 如果將array j 7 陣列的初始順序對冒泡的影響 如果初始陣列就是從小到大的順序,則氣泡排序的比較次...

快速排序 優化

快速排序是對氣泡排序的一種改進。其基本思想基於分治法 在待排序表中選擇乙個元素當作標準記為mark,通過一次排序將排序表分成兩個部分,前一部分是小於mark的所有元素,後一部分是大於等於mark,mark放在了最終的位置上,這一過程叫做一趟快速排序。然後分別遞迴的對兩個子表進行上述重複過程,直到每個...