"""
step 1 : maintain the following structure
a[l] ...... ,,,,,,
< a[l] > a[l]
j i
step 2: in the end, swap(l, j), return j
. .....a[l] ,,,,,,
< a[l] > a[l]
j i
For example:
step 1:
3 1 2 4 0 6 8 7 9
l j
i
3 1 2 4 0 6 8 7 9
l j
i
3 1 2 4 0 6 8 7 9
l j i
3 1 2 0 4 6 8 7 9
l j i
(3) 1 2 (0) 4 6 8 7 9
l j i
step 2:
(0) 1 2 (3) 4 6 8 7 9
l j i
return j
"""
import random
#
#
def partition(a, l, r):
v = a[l]
j = l
i = l + 1
while i <= r:
if a[i] < v:
j += 1
a[j], a[i] = a[i], a[j]
i += 1
a[l], a[j] = a[j], a[l]
return j
def partition_random(a, l, r):
p = random.randint(l, r)
a[l], a[p] = a[p], a[l]
return partition(a, l, r)
def quick_sort(a, l, r):
if l >= r:
return
p = partition(a, l, r)
quick_sort(a, 0, p)
quick_sort(a, p+1, r)
return
def quick_sort_random(a, l, r):
if l >= r:
return
p = partition_random(a, l, r)
quick_sort(a, 0, p)
quick_sort(a, p+1, r)
return
def test_qs(count):
for i in range(count):
a = [2, 1, 5, 3, 0, 4]
random.shuffle(a)
print(f"unsorted list: {a}")
quick_sort(a, 0, len(a)-1)
print(f"normal sorted: {a}")
quick_sort_random(a, 0, len(a)-1)
print(f"random pivot sorted: {a}")
return
test_qs(1)
quick sort
最新推荐文章于 2021-10-06 23:47:08 发布