快速排序穩定性
快速排序時間複雜度
public
class
quicksort
; system.out.
printf
("quicksortleft-排序之前:%s"
, arrays.
tostring
(a))
; system.out.
println()
;quicksortleft
(a,0
, a.length -1)
; system.out.
printf
("quicksortleft-排序之後:%s"
, arrays.
tostring
(a))
; system.out.
println()
;// 測試方式不準確
int[
] arr =
newint
[10000];
random random =
newrandom()
;for
(int i =
0; i < arr.length; i++
)int
arr1 = arrays.
stream
(arr)
.toarray()
;int
arr2 = arrays.
stream
(arr)
.toarray()
;test
(arr1)
;test3
(arr2)
;// test1();
// test2();
}// 測試隨機順序 耗時
private
static
void
test
(int
arr)
// 測試從低到高 順序時耗時
private
static
void
test1()
long start = system.
currenttimemillis()
;quicksortleft
(arr,
0, arr.length -1)
;long end = system.
currenttimemillis()
; system.out.
println
(end - start);}
// 測試從高到低 順序時耗時
private
static
void
test2()
long start = system.
currenttimemillis()
;quicksortleft
(arr,
0, arr.length -1)
;long end = system.
currenttimemillis()
; system.out.
println
(end - start);}
// 測試從高到低 順序時耗時
private
static
void
test3
(int
arr)
/** * 【基準數從左】
** @param a
* @param left
* @param right
*/private
static
void
quicksortleft
(int
a,int left,
int right)
// 儲存基準數
int base = a[left]
;//------------------------------>和【基準數從右】就這換一下right
int i = left;
int j = right;
while
(i != j)
// 從左往右檢索
while
(a[i]
<= base && i < j)
// **走到這裡,都暫停了交換
int temp = a[i]
; a[i]
= a[j]
; a[j]
= temp;
}// 如果i和j相遇,停止檢索,交換基準數和相遇位置數
a[left]
= a[i]
;//------------------------------>和【基準數從右】就這換一下right a[right] = a[i];
a[i]
= base;
// 基準數歸位,左邊比他小,右邊比他大
quicksortleft
(a, left, i -1)
;quicksortleft
(a, i +
1, right);}
/** * 優化版本
* @param arr
* @param low
* @param high
*/private
static
void
quicksort
(int
arr,
int low,
int high)
}private
static
intgetindex
(int
arr,
int low,
int high)
// 如果隊尾元素小於base了,需要將其賦值給low
arr[low]
= arr[high]
;// 當隊首元素小於等於base時,向前挪動low指標
while
(low < high && arr[low]
<= base)
// 當隊首元素大於base時,需要將其賦值給high
arr[high]
= arr[low];}
// 跳出迴圈時low和high相等,此時的low或high就是base的正確索引位置
// 由原理部分可以很清楚的知道low位置的值並不是base,所以需要將base賦值給arr[low]
arr[low]
= base;
return low;
// 返回base的正確位置
}}
排序 快速排序
快速排序時實踐中最快的一直排序,平均時間是0 nlogn 最壞的情況是o n2 但是很容易將這種情況避免 空間複雜度 o n lgn 不穩定。快速排序時基於分治模式處理的,對乙個典型子陣列a p.r 排序的分治過程為三個步驟 1.分解 a p.r 被劃分為倆個 可能空 的子陣列a p q 1 和a ...
排序 快速排序
定義 在快速排序演算法中,使用了分治策略,將要排序的序列分成兩個子串行,然後遞迴地對子序列進行排序,直到整個序列排序完畢。步驟 1.在序列中選擇乙個關鍵元素作為軸 2.對序列進行重新排序,將比軸小的元素移到軸的前邊,比軸大的元素移動到軸的後面。在進行劃分之後,軸便在它最終的位置上 3.遞迴地對兩個子...
排序 快速排序
時間複雜度 快速排序每次將待排序陣列分為兩個部分 1 在理想狀況下,每一次都將待排序陣列劃分成等長兩個部分,則需要logn次劃分。2 在最壞情況下,即陣列已經有序或大致有序的情況下,每次劃分只能減少乙個元素,快速排序將不幸退化為氣泡排序,最壞情況為o n 2 快速排序的平均時間複雜度為o nlogn...