一、快速排序的思想
基於分治的思想,是氣泡排序的改進型。首先在陣列中選擇乙個基準點(該基準點的選取可能影響快速排序的效率,後面講解選取的方法),然後分別從陣列的兩端掃瞄陣列,設兩個指示標誌(lo指向起始位置,hi指向末尾),首先從後半部分開始,如果發現有元素比該基準點的值小,就交換lo和hi位置的值,然後從前半部分開始掃秒,發現有元素大於基準點的值,就交換lo和hi位置的值,如此往復迴圈,直到lo>=hi,然後把基準點的值放到hi這個位置。一次排序就完成了。以後採用遞迴的方式分別對前半部分和後半部分排序,當前半部分和後半部分均有序時該陣列就自然有序了。
排序過程:
二、下面我們來看乙個具體的例子:
下面我們通過乙個案例來演示一下快速排序的基本步驟: 以序列 46 30 82 90 56 17 95 15 共8個元素
初始狀態: 46 30 82 90 56 17 95 15 選擇46 作為基準值,i = 0, j = 7
i = 0 j = 7
15 30 82 90 56 17 95 46 15 < 46, 交換 15 和 46,移動 i, i = 1
i = 1 j = 7
15 30 82 90 56 17 95 46 30 < 46, 不需要交換,移動 i , i = 2
i = 2 j = 7
15 30 46 90 56 17 95 82 82 > 46, 交換82 和 46,移動 j , j = 6
i = 2 j = 6
15 30 46 90 56 17 95 82 95 > 46, 不需要交換,移動 j , j = 5
i = 2 j = 5
15 30 17 90 56 46 95 82 17 < 46, 交換46 和 17,移動 i, i = 3
i = 3 j = 5
15 30 17 46 56 90 95 82 90 > 46, 交換90 和 46,移動 j , j = 4
3 = i j = 4
15 30 17 46 56 90 95 82 56 > 46, 不需要交換,移動 j , j = 3
i = j = 3
i = j = 3, 這樣序列就這樣分割成了兩部分,左邊部分 均小於 基準值(46);右邊部分 ,均大於基準值。這樣子我們就達到了分割序列的目標。在接著對子序列用同樣的辦法進行分割,直至子串行不超過乙個元素,那麼排序結束,整個序列處於有序狀態。
三、快速排序演算法的實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public
static
int
getmiddle(
int
list,
int
low,
int
high)
list[low] = list[high];
//比中軸小的記錄移到低端
while
(low < high && list[low] <= tmp)
list[high] = list[low];
//比中軸大的記錄移到高階
}
list[low] = tmp;
//中軸記錄到尾
return
low;
//返回中軸的位置
}
public
static
void
_quicksort(
int
list,
int
low,
int
high)
}
所謂的中軸的位置就是選擇的那個基準數所在的位置。
使用的時候直接呼叫_quicksort方法即可,low為陣列的第乙個元素的下標0,high為陣列的最後乙個元素的下標a.length-1
。 快速排序的時間複雜度為o(nlogn)。
排序 快速排序(java實現)
快速排序是一種非常高效的排序演算法,它採用了 分而治之 的思想,把大的拆分成小的,小的再拆分為更小的。其原理如下 對於給定一組記錄,通過一趟排序後,將原序列分為兩部分,其中前一部分的所有記錄都比後一部分的所有記錄小,然後再依次對前後兩部分的記錄進行快速排序,遞迴該過程,直到序列中所有的記錄均為有序為...
Java實現快速排序
package com.handy.ds public class quicksort for int i 0 i a.length i system.out.print a i system.out.println quicksort qs new quicksort qs.quitsort a,...
java實現快速排序
快速排序是平均速度最快的排序演算法,他的平均時間複雜度 n log n 快速排序採用分治法來進行排序,首先先給出乙個陣列,在一開始隨意選擇乙個數pivot,已pivot作為這個陣列的分界點,把大於pivot的數放在右邊,小於pivot的數放在左邊,然後在已pivot的兩邊分界點,右進行一次上一次的操...