• 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 

          

  • 相关阅读:
    【Oracle-DBA】Oracle连接非常慢APPARENT DEADLOCK
    【PC-x86-x64】JDK 32bit与64bit的区别及x64 PC的发展历程【转】
    css框架,一把锋利的剑
    OnContextMenu事件(转)
    960网格,一个web时代的标志。
    程序员取名:用大数据分析一下宝宝取名时最容易重复的名字
    创建你的第一个JavaScript库
    5个经典的前端面试问题,你行吗?
    一个由SEO优化展开的meta标签大讲解
    HTML5页面开发的基础性模板
  • 原文地址:https://www.cnblogs.com/tulintao/p/10777279.html
Copyright © 2020-2023  润新知