快速排序
-
快速排序(Quicksort),又称划分交换排序(partition-exchange sort),将要排序的数列分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
-
希尔排序算法的具体运作如下:
- 记录数列第一个元素为中间值,设立两个游标,分别位于数列始末。
- 将末尾游标指向的值与中间值进行比较,若中间值大,则将末尾游标指向的值置于起始游标处,否则游标做左移处理。
- 上一步中,若未发生数列值的改变,则重复执行,直到数列值发生改变,则开始移动起始游标。
- 将起始游标指向的值与中间值进行比较,若中间值小,则将起始游标指向的值置于末尾游标处,否则游标做右移处理。
- 上一步中,若未发生数列值的改变,则重复执行,直到数列值发生改变,则再开始移动末尾游标。
- 重复以上步骤,直到起始游标与末尾游标重合,将中间值置于重合处。
- 对中间值的前半部分和后半部分分别进行以上步骤,递归完成排序。
-
算法实现(分步)
ali = [54, 26, 93, 22, 77, 31, 44, 55, 20]
n = len(ali) # 9
1.记录数列第一个元素为中间值,设立两个游标,分别位于数列始末。
def fast_sort(ali, first, last):
mid_value = ali[first]
low = first
high = last
2.将末尾游标指向的值与中间值进行比较,若中间值大,则将末尾游标指向的值置于起始游标处,否则游标做左移处理。
if ali[high] < mid_value:
ali[low] = ali[high]
low += 1
else:
high -= 1
3.上一步中,若未发生数列值的改变,则重复执行,直到数列值发生改变,则开始移动起始游标。将起始游标指向的值与中间值进行比较,若中间值小,则将起始游标指向的值置于末尾游标处,否则游标做右移处理。若未发生数列值的改变,则重复执行,直到数列值发生改变,则再开始移动末尾游标。
while low < high:
if ali[high] < mid_value:
ali[low] = ali[high]
low += 1
break
else:
high -= 1
while low < high:
if ali[low] > mid_value:
ali[high] = ali[low]
high -= 1
break
else:
low += 1
4.重复以上步骤,直到起始游标与末尾游标重合,将中间值置于重合处。
while low < high:
while low < high:
if ali[high] < mid_value:
ali[low] = ali[high]
low += 1
break
else:
high -= 1
while low < high:
if ali[low] > mid_value:
ali[high] = ali[low]
high -= 1
break
else:
low += 1
ali[low] = mid_value
5.对中间值的前半部分和后半部分分别进行以上步骤,递归完成排序。
fast_sort(ali, first, low - 1)
fast_sort(ali, low + 1, last)
- 算法实现(整体)
import random
def fast_sort(ali, first, last):
if first >= last:
return
mid_value = ali[first]
low = first
high = last
while low < high:
while low < high:
if ali[high] < mid_value:
ali[low] = ali[high]
low += 1
break
else:
high -= 1
while low < high:
if ali[low] > mid_value:
ali[high] = ali[low]
high -= 1
break
else:
low += 1
ali[low] = mid_value
fast_sort(ali, first, low - 1)
fast_sort(ali, low + 1, last)
if __name__ == '__main__':
ali = [random.randint(0, 10000) for i in range(500)]
print(ali)
fast_sort(ali, 0, len(ali)-1)
print(ali)