快速排序的優化

2021-08-20 02:14:59 字數 1773 閱讀 7814

快速排序的優化:

1,隨機選取基準法

2,三分基準法

3,當代排序陣列當中資料比較少的時候用直接插入法

4,聚集相同元素法(基準一樣的元素)

一,當序列有序的時候快速排序的時間複雜度將會變成o(n2)。

例如:1   2    3   4   5   6    7   8   9

所以我們要採取優化來使基準不會一直被選取最小的那個數。

這時候我們可以採用隨機選取基準或者三分基準法來解決這個問題

>1,隨機基準法

隨機選取代排序數列中的乙個數作為基準進行排序

//隨機基準

public static void new_quick(int array,int low,int high)

if(par < high-1)

} //交換隨機數和array[low]

public static void swap(int array,int start,int end)

>2,三分基準法

取 low, high, 還有 mid(位於low下標和high下標中間),將它們對應的數中處於中間大小的數作為基準進行排序,這樣可以有效避免有序數列所帶來 的較大的時間複雜度!

//三數取中法

public static void med(int array,int low,int high)

if(array[low] > array[high])

if(array[mid] > array[low])

//array[mid]low+1)

if(par < high-1)

}

二,代排序元素少的情況下直接插入法比快速排序更加快一點,所以當代排序陣列當中資料比較少的時候用直接插入法。

//元素少時用直接插入

public static void insrtsort(int array,int low,int high) else

}array[j+1] = temp;

} }public static void new_quick2(int array,int low,int high)else

if(par < high-1)

} }

三,當數列為這樣的時候

這個時候要是變成這樣

//聚集相同的元素

public static void new_quick3(int array,int low,int high)

if(par < high-1)

} private static int focusnum(int array, int low, int high, int par,

int left, int right) else

}} left = par_left;

//右邊找

for(int i = par+1;i <= high;i++)else

}} right = par_right;

int a = new int[2];

a[0]= left;

a[1] = right;

return a;

}

優化的快速排序

快速排序 void swap int a,int b int median3 int a,int left,int right if a left a right if a center a right 將中值放在倒數第二個位置並作為樞紐元返回 swap a center a right 1 ret...

快速排序的優化

快排是效率很高的排序方法,但仍有一些問題,如穩定性不高,處理小陣列效率不算很高,處理重複數字效率低,難以選取最優中軸 主要有三種優化方式 前 中 後三者排序 並把中軸放在high 1的位置 如 會處理為 public static void dealpivot int arr,int left,in...

快速排序 優化

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