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

问的解决思路:

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

      具体的过程就是当前无序区list[1.n]中任意去一个元素x(一般都是取第一个元素)作为比较的“基准”,用这个基准数将当前无序区划分为左右两个较小的无序区

list[1,i- 1]和list[i + 1,n],且左边的无序子区中数据元素均小于基准元素,右边的无序子区中的元素均大于或等于基准元素,而基准数x则位于最终的排序的位置上,当list[1,i- 1]和list[i + 1,n]均非空时,分别对它们进行上述的划分过程,直到所有的无序子区中的数据元素均已排序为止。

那就先来看看代码吧:

 from random import randint
def quick_sort(lst, first, last):
low = first
high = last
if first < last:
mid_value = lst[first]
while low < high:
while low < high and lst[high] >= mid_value:
high = high - 1
lst[low] = lst[high]
while low < high and lst[low] <= mid_value:
low = low + 1
lst[high] = lst[low]
lst[low] = mid_value
quick_sort(lst, first, low - 1)
quick_sort(lst, low + 1, last)
return lst l = []
for i in range(10):
l.append(randint(1, 100))
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

      

python --- 快速排序算法的更多相关文章

  1. Python 快速排序 算法

    基本的快排算法,二分法 #!/usr/bin/env python # encoding: utf-8 l1=[1,4,2,6,3] def path_sort(l,start_index,end_i ...

  2. Python—快速排序算法

    # _*_ coding=utf-8 _*_ """ 快速排序: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比 另外一部分的所有数据都要小,然后 ...

  3. python实现快速排序算法

    快速排序算法又称划分交换排序(partition-exchange sort),一种排序算法,最早由东尼·霍尔提出.在平均状况下, 排序n个项目要O(nlogn)次比较.在最坏状况下则需要O(n*2) ...

  4. $用python实现快速排序算法

    本文主要介绍用python实现基本的快速排序算法,体会一下python的快排代码可以写得多么简洁. 1. 三言两语概括算法核心思想 先从待排序的数组中找出一个数作为基准数(取第一个数即可),然后将原来 ...

  5. 使用Python实现的4种快速排序算法

    快速排序算法,总体来说就是选一个基准值,把小于基准值的分一拨,把大于基准值的分到另一拨,然后递归. 有区别的是,分区算法有差异,最直接的是,选个基准值,定义两个列表(小值分区less和大值分区grea ...

  6. python 排序算法总结及实例详解

    python 排序算法总结及实例详解 这篇文章主要介绍了python排序算法总结及实例详解的相关资料,需要的朋友可以参考下 总结了一下常见集中排序的算法 排序算法总结及实例详解"> 归 ...

  7. Algorithms - Quicksort - 快速排序算法

    相关概念 快速排序法 Quicksort 也是一个分治思想的算法. 对一个子数组 A[p: r] 进行快速排序的三步分治过程: 1, 分解. 将数组 A[p : r] 被划分为两个子数组(可能为空) ...

  8. 带你掌握4种Python 排序算法

    摘要:在编程里,排序是一个重要算法,它可以帮助我们更快.更容易地定位数据.在这篇文章中,我们将使用排序算法分类器对我们的数组进行排序,了解它们是如何工作的. 本文分享自华为云社区<Python ...

  9. Python基础算法综合:加减乘除四则运算方法

    #!usr/bin/env python# -*- coding:utf-8 -*-#python的算法加减乘除用符号:+,-,*,/来表示#以下全是python2.x写法,3.x以上请在python ...

随机推荐

  1. lvs与nginx区别

    lvs和nginx都可以用作多机负载方案,他们各有优缺点,在生产环境中需要好好分析实际情况并加以利用. 一.lvs的优势: 1.抗负载能力强,因为lvs工作方式的逻辑是非常简单的,而且工作再网络层第4 ...

  2. 搭建centos7的开发环境3-Spark安装配置

    说起大数据开发,必然就会提到Spark,在这片博文中,我们就介绍一下Spark的安装和配置. 这是Centos7开发环境系列的第三篇,本篇的安装会基于之前的配置进行,有需要的请回复搭建centos7的 ...

  3. 微信小程序入门三实战

    微信小应用借鉴了很多web的理念,但是其与传统的webApp.微信公共号这些BS架构不同,他是CS架构,是客户端的程序 小程序开发实战--豆瓣电影 项目配置 -在app.jsop中进行简单配置 --n ...

  4. java运行机制、Jdk版本及Java环境变量

    一.语言特性 计算机高级语言按程序的执行方式可分为:编译型和解释型两种.编译型的语言是指使用专门的编译器,针对特定的平台(操作系统)一次性翻译成被该平台硬件执行的机器码,并包装成该平台可执行性程序文件 ...

  5. Kafka安装之 Zookeeper

    一 . Zookeeper 概述        ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它 ...

  6. Flask入门之SQLAlchemy配置与数据库连接

    1. 安装SQLAlchemy pip install flask-sqlalchemy 2. 导入和配置 from flask_sqlalchemy import SQLAlchemy basedi ...

  7. 洛谷 P2205 解题报告

    P2205 画栅栏Painting the Fence 题目描述 \(Farmer\) \(John\) 想出了一个给牛棚旁的长围墙涂色的好方法.(为了简单起见,我们把围墙看做一维的数轴,每一个单位长 ...

  8. Manjaro 安装后的配置

    1. 将本地数据包与远程数据包同步 sudo pacman -Syy 默认manjaro是没有同步数据包的,也就是说,这个时候你执行pacman -S pack_name 会报数据包找不到的错误(wa ...

  9. Python(2)深入Python函数定义

    Python学习 Part2:深入Python函数定义 在Python中,可以定义包含若干参数的函数,这里有几种可用的形式,也可以混合使用: 1. 默认参数 最常用的一种形式是为一个或多个参数指定默认 ...

  10. wcf双工通讯

    首先说一个服务引用不成功的解决办法: 需要把服务端配置文件中的Binding换成: <endpoint address="" binding="BasicHttpB ...