快速排序是對氣泡排序的一種改進。
它的基本思想是:通過一次排序將資料分割成兩部分,其中一部分的資料都比另外一部分的資料都要小,然後在對這兩部分進行相同操作
基本流程1.先從數列中取出乙個數作為基準數。
2.分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。
3.再對左右區間重複第二步,直到各區間只有乙個數。
def
quicksort
(datas:
list):
deffunc
(begin:
int, end:
int)
:if begin == end or begin == end +1:
return
front:
int= begin
rear:
int= end
pivot = datas[front]
while front < rear:
while front < rear and datas[rear]
>= pivot: rear -=
1 datas[front]
= datas[rear]
while front < rear and datas[front]
<= pivot: front +=
1 datas[rear]
= datas[front]
datas[front]
= pivot
func(begin, front)
func(front +
1, end)
func(0,
len(datas)-1
)
def
main()
: size:
int=
20 l =
for i in
range(0
, size):)
* size *10)
)print
("排序前:"
, l)
quicksort(l)
print
("排序後:"
, l)
資料量10^4
10^5
10^6
10^7
耗時/ms
43.2
601.1
7179.9
87891.9
template
<
typename t>
void
quicksort
(t* arr,
int size)
arr[front]
= arr[rear]
;while
(front < rear && arr[front]
<= pivot)
arr[rear]
= arr[front];}
arr[front]
= pivot;
quicksort
(arr, front)
;quicksort
(arr + front +
1, size -
1- front)
;}
資料量
10^4
10^5
10^6
10^7
耗時/ms
0.8397
10.713
133.032
3680.29
public
static
comparable
>
void
quicksort
(t array)
private
static
comparable
>
void
_quicksort
(t array,
int begin,
int end)
array[front]
= pivot;
_quicksort
(array, begin, front -1)
;_quicksort
(array, front +
1, end)
;}
資料量
10^4
10^5
10^6
10^7
耗時/ms
4.0115.3
440.5
4059.8
平均時間複雜度 o(nlogn)
最壞時間複雜度 o(n²) 對乙個降序序列排序,退化成氣泡排序
穩定性:不穩定
排序演算法之快速排序
快速排序使用分治法 divide and conquer 策略來把乙個序列 list 分為兩個子串行 sub lists 步驟為 從數列中挑出乙個元素,稱為 基準 pivot 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面 相同的數可以到任一邊 在這個分割槽退出...
排序演算法之快速排序
快速排序入口 public void quicksort int lists 遞迴呼叫該函式。原理 每次從陣列從選乙個標兵 本實現為簡單起見直接選取給定範圍內的第乙個元素為標兵 讓後在給定範圍內進行雙向遍歷,目的是以標兵為分界線,將所有小於標兵值的數字排一邊,將所有大於標兵的數字 放到另一邊。標兵移...
排序演算法之快速排序
快速排序是一種不穩定的排序演算法,它的基本思想是,以某個元素為基準,將所有大於等於它的值放在右邊,小於它的值放在左邊,這樣陣列就被分為兩部分,遞迴對這兩部分進行快速排序,而單個元素我們認為是已經排好序的。這是一種歸併思想,當然在最後一步,合併,我們什麼也沒有做也不用做。每一次排序都有乙個元素被放在正...