快速排序的優化:
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放在了最終的位置上,這一過程叫做一趟快速排序。然後分別遞迴的對兩個子表進行上述重複過程,直到每個...