排序 快速排序

2021-10-23 16:40:43 字數 3352 閱讀 4529

快速排序穩定性

快速排序時間複雜度

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...