Skip to content

Commit 23c3502

Browse files
Merge pull request #329 from Song2017/master
Quick Sort Via Two Way
2 parents b4ef1c8 + ce37bb2 commit 23c3502

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
def QuickSort(arr):
2+
# 双向排序: 提高非随机输入的性能
3+
# 不需要额外的空间,在待排序数组本身内部进行排序
4+
# 基准值通过random随机选取
5+
# 入参: 待排序数组, 数组开始索引 0, 数组结束索引 len(array)-1
6+
if arr is None or len(arr) < 1:
7+
return arr
8+
9+
def swap(arr, low, upper):
10+
tmp = arr[low]
11+
arr[low] = arr[upper]
12+
arr[upper] = tmp
13+
return arr
14+
15+
def QuickSort_TwoWay(arr, low, upper):
16+
# 小数组排序i可以用插入或选择排序
17+
# if upper-low < 50 : return arr
18+
# 基线条件: low index = upper index; 也就是只有一个值的区间
19+
if low >= upper:
20+
return arr
21+
# 随机选取基准值, 并将基准值替换到数组第一个元素
22+
swap(arr, low, int(random.uniform(low, upper)))
23+
temp = arr[low]
24+
# 缓存边界值, 从上下边界同时排序
25+
i, j = low, upper
26+
while True:
27+
# 第一个元素是基准值,所以要跳过
28+
i += 1
29+
# 在小区间中, 进行排序
30+
# 从下边界开始寻找大于基准值的索引
31+
while i <= upper and arr[i] <= temp:
32+
i += 1
33+
# 从上边界开始寻找小于基准值的索引
34+
# 因为j肯定大于i, 所以索引值肯定在小区间中
35+
while arr[j] > temp:
36+
j -= 1
37+
# 如果小索引大于等于大索引, 说明排序完成, 退出排序
38+
if i >= j:
39+
break
40+
swap(arr, i, j)
41+
# 将基准值的索引从下边界调换到索引分割点
42+
swap(arr, low, j)
43+
QuickSort_TwoWay(arr, low, j - 1)
44+
QuickSort_TwoWay(arr, j + 1, upper)
45+
return arr
46+
47+
return QuickSort_TwoWay(arr, 0, len(arr) - 1)
48+
49+
50+
if __name__ == "__main__":
51+
a1 = [3, 5, 6, 7, 8]
52+
a2 = [2, 2, 2, 2]
53+
a3 = [4, 3, 2, 1]
54+
a4 = [5, -1, 9, 3, 7, 8, 3, -2, 9]
55+
QuickSort(a1)
56+
print(a1)
57+
QuickSort(a2)
58+
print(a2)
59+
QuickSort(a3)
60+
print(a3)
61+
QuickSort(a4)
62+
print(a4)

0 commit comments

Comments
 (0)