在快速排序中引入递归和分治的概念(关于递归和分治的概念会单独写一篇来进行介绍)
问的解决思路:
快速排序的基本思想本身就是分治法,通过分割,将无序序列分成两部分,其中前一部分的元素值都要小于后一部分的元素值。然后每一部分在各自递归进行上述的过程,直到每一部分的长度都为1为止。
具体的过程就是当前无序区list[1.n]中任意去一个元素x(一般都是取第一个元素)作为比较的“基准”,用这个基准数将当前无序区划分为左右两个较小的无序区
list[1,i- 1]和list[i + 1,n],且左边的无序子区中数据元素均小于基准元素,右边的无序子区中的元素均大于或等于基准元素,而基准数x则位于最终的排序的位置上,当list[1,i- 1]和list[i + 1,n]均非空时,分别对它们进行上述的划分过程,直到所有的无序子区中的数据元素均已排序为止。
那就先来看看代码吧:
1 from random import randint 2 def quick_sort(lst, first, last): 3 low = first 4 high = last 5 if first < last: 6 mid_value = lst[first] 7 while low < high: 8 while low < high and lst[high] >= mid_value: 9 high = high - 1 10 lst[low] = lst[high] 11 while low < high and lst[low] <= mid_value: 12 low = low + 1 13 lst[high] = lst[low] 14 lst[low] = mid_value 15 quick_sort(lst, first, low - 1) 16 quick_sort(lst, low + 1, last) 17 return lst 18 19 20 l = [] 21 for i in range(10): 22 l.append(randint(1, 100)) 23 print(quick_sort(l, 0, len(l) - 1))
我们现在就依照这段代码来看一个示例:
初始关键字[75, 24, 86, 72, 86, 79, 65, 25, 86, 50]
第一次划分的过程:
x的初始值是序列的第一个元素75
high从右往左扫描,当找到第一个小于x的元素50,第一次交换之后[50, 24, 86, 72, 86, 79, 65, 25, 86, 75]
low从左往右扫描,当找到第一个大于x的元素86,第二次交换之后[50, 24, 75, 72, 86, 79, 65, 25, 86, 86]
high从上次扫描到的位置继续往左扫描,第三次交换[50, 24, 25, 72, 86, 79, 65, 75, 86, 86]
low也从上次位置继续往右扫描,第四次交换[50, 24, 25, 72, 75, 79, 65, 86, 86, 86]
high继续扫描,第五次交换[50, 24, 25, 72, 65, 79, 75, 86, 86, 86]
low也继续进行扫描,第六次交换[50, 24, 25, 72, 65, 75, 79, 86, 86, 86]
各遍排序之后的状态:
初始关键字[75, 24, 86, 72, 86, 79, 65, 25, 86, 50]
第一次排序之后:[50, 24, 25, 72, 65] 75 [79, 86, 86, 86]
第二次排序之后:[25, 24] 50 [72, 65] 75, 79, 86, 86, 86
第三次排序之后:24, 25, 50, 65, 72, 75,79, 86, 86, 86
所以最后的排序结果就是——24, 25, 50, 65, 72, 75,79, 86, 86, 86