O nlogn 快速排序 基礎版 詳細注釋

2021-10-10 17:02:39 字數 2627 閱讀 9411

相關使用的工具類與介面

執行效率

/**

* 這是乙個快速排序

* 陣列長度[2000] 值範圍[1-2000] 消耗的時間為[1]毫秒

* 陣列長度[4000] 值範圍[1-4000] 消耗的時間為[1]毫秒

* 陣列長度[8000] 值範圍[1-8000] 消耗的時間為[1]毫秒

* 陣列長度[16000] 值範圍[1-16000] 消耗的時間為[1]毫秒

* 陣列長度[32000] 值範圍[1-32000] 消耗的時間為[1]毫秒

* 陣列長度[64000] 值範圍[1-64000] 消耗的時間為[3]毫秒

* 陣列長度[128000] 值範圍[1-128000] 消耗的時間為[6]毫秒

* 陣列長度[256000] 值範圍[1-256000] 消耗的時間為[16]毫秒

* 陣列長度[512000] 值範圍[1-512000] 消耗的時間為[35]毫秒

* 陣列長度[1024000] 值範圍[1-1024000] 消耗的時間為[71]毫秒

* 陣列長度[2048000] 值範圍[1-2048000] 消耗的時間為[153]毫秒

* 陣列長度[4096000] 值範圍[1-4096000] 消耗的時間為[325]毫秒

* 陣列長度[8192000] 值範圍[1-8192000] 消耗的時間為[675]毫秒

* 陣列長度[16384000] 值範圍[1-16384000] 消耗的時間為[1397]毫秒

* 陣列長度[32768000] 值範圍[1-32768000] 消耗的時間為[2890]毫秒

* 陣列長度[65536000] 值範圍[1-65536000] 消耗的時間為[6031]毫秒

* 陣列長度[131072000] 值範圍[1-131072000] 消耗的時間為[12727]毫秒

* 陣列長度[262144000] 值範圍[1-262144000] 消耗的時間為[25993]毫秒

* * process finished with exit code 0

*/@test

public

void

quicksorttest()

實現**

public

static

final random random =

newrandom()

;@override

public string getsortname()

@override

public

int[

]arraysortmethod

(int

ints)

/** * 最初的快排演算法邏輯

** @param ints 整個陣列

* @param l 當前最小索引

* @param r 當前最大索引

*/private

intquicksort

(int

ints,

int l,

int r)

}//到這裡j記錄的就是比v小一邊的最大索引

//以上迴圈完成後就可以確定l索引在ints陣列中排序的位置

sorthelper.

swap

(ints, j, l)

;//返回l在ints中排好序確定的索引位置 並以j分割繼續遞迴排序

return j;

}/**

* 最初的快排演算法邏輯

** @param ints

* @param l

* @param r

*/public

void

sort

(int

ints,

int l,

int r)

//在資料量較小的時候使用插入排序

//這是因為經過了r-l>15的快速排序後 小一邊和大一邊的模糊排序後

//在r-l<=15 的時候之間的最大差已經很小了

//在最大差越小的情況下順序可能是越有序的

//說不定已經近乎有序的了 優化的快速排序對近乎有序的排序效率非常高

//優化後的插入排序對近乎有序的陣列進行效率相對較高

//插入排序相對歸併排序減少了陣列交換的過程

if(r - l <=15)

//個人理解快排核心

//每次遍歷排序對l-r之間的陣列進行區分

//好處1.每次遍歷可以定位乙個p索引在ints陣列中確定的位置

//好處2.因為每次排序都對l-r之間的資料進行大小劃分做了一次模糊的排序

//保證下次排序l-r排序之間最大差越來越小

//所以下次遍歷都比上次排序更加有序效率相對更快

int p =

quicksort

(ints, l, r)

;//以p中心點-1和+1為界限繼續遞迴快速排序

sort

(ints, l, p -1)

;sort

(ints, p +

1, r)

;}

快速排序詳細講解

五種常見排序就是 冒泡 插入 選擇 快速排序 歸併排序 排序和查詢的關係 排序是查詢的前提 排序是重點 在這裡,快速排序,顧名思義,排序速度較快,但是較為複雜,但是遞迴這個思想,說簡單但是也有些繞,說難也就幾行 的問題。先確定無序陣列裡的某乙個元素在有序裡的位置,這樣就把陣列分成兩半無序陣列 每一半...

golang 版快速排序

快速排序作為經典演算法,基本面試中都會遇到,今天記錄一下。1.非遞迴版,這裡也是使用乙個棧的模型 自己實現 來實現。需要注意的是inte ce轉int需要斷言。package main import container list fmt stack is stack type stack struc...

基礎排序 快速排序

快速排序 和歸併排序一樣,用了分治的思想,不過分的有些不同,歸併排序是先把陣列分的很小很小在進行簡單的操作從而達到目的,也就是先分在排序,但是快速排序是先排序再分,我覺得快速排序把數字轉來轉去,其意思就是找到這個數在這個陣列的位置,而且找到就不會變,有些像選擇排序的意思,但是快速排序在比較的過程中沒...