python --- 快速排序算法

在快速排序中引入递归和分治的概念(关于递归和分治的概念会单独写一篇来进行介绍)

问的解决思路:

      快速排序的基本思想本身就是分治法,通过分割,将无序序列分成两部分,其中前一部分的元素值都要小于后一部分的元素值。然后每一部分在各自递归进行上述的过程,直到每一部分的长度都为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 

 

 

 

 

 

 

 

      

 

posted @ 2019-04-26 23:49  tulintao  阅读(639)  评论(0编辑  收藏  举报