• 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 

          

  • 相关阅读:
    Ubuntu中安装gdal python版本
    python中在计算机视觉中的库及基础用法
    Google earth爬取卫星影像数据并进行标注路网的方法
    事务
    文件的下载,随机验证码(无验证)登录注册
    类的加载器和反射
    等待唤醒机制,UDP通信和TCP通信
    线程池,多线程,线程异步,同步和死锁,Lock接口
    多线程, Thread类,Runnable接口
    转换流,缓冲流
  • 原文地址:https://www.cnblogs.com/tulintao/p/10777279.html
Copyright © 2020-2023  润新知