1. 快速排序 QuickSort

  • 又称划分交换排序(partition-exchange sort)
  • 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要
  • 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行

1.1 步骤

  1. 从数列中挑出一个元素,称为"基准"(pivot)
  2. 排序数列,元素比基准值小的元素放到基准前面,所有比基准值大的元素放到基准后面
    • 相同的数两边都能放,统一就好
  3. 在这个分区结束之后,该基准就处于数列的中间位置(其实就是它最终的位置)
    • 这个称为分区(partition)操作
  4. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序
  5. 递归出口:数列的大小是零或一
    • 也就是已经被排序好了
    • 因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去

1.2 性能分析

  • 最优时间复杂度:O(nlogn)
  • 最坏时间复杂度:O(n2)
  • 稳定性:不稳定

1.3 Python 代码示例

  • 快排版本不唯一
  • 这个只能算是快排的思路,比较费空间
from random import randrange

def quick_sort(lst):
n = len(lst)
if n <= 1:
return lst pivot = lst[-1]
front, rear = [], []
for i in range(n-1):
if lst[i] < pivot:
front.append(lst[i])
else:
rear.append(lst[i])
return quick_sort(front) + [pivot] + quick_sort(rear) if __name__ == "__main__":
lst = [randrange(10, 100) for _ in range(10)] print(">>> before sort:", lst)
new_list = quick_sort(lst)
print(">>> after sort: ", new_list)
  • 改进后的快排
from random import randrange

def quick_sort(lst, start, stop):
if stop <= start:
return pivot = lst[stop]
low, high = start, stop
while low < high:
while low < high and lst[low] < pivot:
low += 1
lst[high] = lst[low]
while low < high and pivot <= lst[high]:
high -= 1
lst[low] = lst[high]
lst[low] = pivot
quick_sort(lst, start, low-1)
quick_sort(lst, low+1, stop) if __name__ == "__main__":
lst = [randrange(10, 100) for _ in range(10)] print(">>> before sort:", lst)
quick_sort(lst, 0, len(lst)-1)
print(">>> after sort: ", lst)

2. 归并排序 MergeSort

2.1 步骤

  1. 先说出口:当数列中的元素小于等于 1 时,即可退出
  2. 将数列对半分开
  3. 左边递归地排序
  4. 右边递归地排序
  5. 将左右两边合并

2.2 性能分析

  • 最优时间复杂度:O(nlogn)
  • 最坏时间复杂度:O(nlogn)
  • 稳定性:稳定

2.3 Python 代码示例

from random import randrange

def merge_sort(lst):
n = len(lst)
if n <= 1:
return lst mid = n // 2
left = merge_sort(lst[:mid])
right = merge_sort(lst[mid:])
return merge(left, right) def merge(left, right):
L, R = 0, 0
result = []
nL, nR = len(left), len(right)
while L < nL and R < nR:
if left[L] < right[R]:
result.append(left[L])
L += 1
else:
result.append(right[R])
R += 1
if L < nL:
result += left[L:]
if R < nR:
result += right[R:]
return result if __name__ == "__main__":
lst = [randrange(10, 100) for _ in range(10)] print(">>> before sort:", lst)
sorted_list = merge_sort(lst)
print(">>> after sort: ", sorted_list)

[DS+Algo] 006 两种简单排序及其代码实现的更多相关文章

  1. [DS+Algo] 005 三种简单排序及其代码实现

    目录 1. 冒泡排序 BubbleSort 1.1 算法描述 1.2 性能分析 1.3 Python 代码实现 2. 选择排序 SelectionSort 2.1 算法描述 2.2 选择排序的主要优点 ...

  2. 两种简单实现菜单高亮显示的JS类(转载)

    两种简单实现菜单高亮显示的JS类   近期在写一个博客管理后台的前端,涉及在同一页面两种高亮显示当前菜单的需求.记得当年写静态页时,为了实现高亮都是在每个页面加不同的样式,呵.高亮显示我觉得对于web ...

  3. GIT将本地项目上传到Github(两种简单、方便的方法)

    GIT将本地项目上传到Github(两种简单.方便的方法) 一.第一种方法: 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安 ...

  4. Java执行shell脚本并返回结果两种方法的完整代码

    Java执行shell脚本并返回结果两种方法的完整代码 简单的是直接传入String字符串,这种不能执行echo 或者需要调用其他进程的命令(比如调用postfix发送邮件命令就不起作用) 执行复杂的 ...

  5. Visual Studio写的项目在 IIS 服务器上运行的两种简单方法

    首先需要PC上开启了IIS服务,相关方法网上很多,也很简单 第一种:直接在项目中操作 1.创建一个项目,然后右击选中项目,右击,单击属性,打开项目属性标签页面 如图,选择Web标签,在服务器栏目中选中 ...

  6. Gradle实现的两种简单的多渠道打包方法

    本来计划今天发Android的官方技术文档的翻译--<Gradle插件用户指南>的第五章的,不过由于昨天晚上没译完,还差几段落,所以只好推后了. 今天就说一下使用Gradle进行类似友盟这 ...

  7. Android 关于在ScrollView中加上一个ListView,ListView内容显示不完全(总是显示第一项)的问题的两种简单的解决方案

    是这样的哈: 有这样一个需求: 1.显示一个界面,界面上有一个列表(ListView),列表上面有一个可以滚动的海报. 2.要求在ListView滚动的过程中,ListView上面的海报也可以跟着Li ...

  8. 两种简单的servlet实现反向代理

    以下两种方法都需要引入jar包: <dependency> <groupId>org.mitre.dsmiley.httpproxy</groupId> <a ...

  9. Android传递Bitmap的两种简单方式及其缺陷

    Android传递Bitmap的几种简单方式 一,通过Intent的Bundle. 比如有两个activity,A,B,从A进入B.先在A中将Bitmap写进去: Resources res=getR ...

随机推荐

  1. 第六章 Linux文件与目录管理

    http://www.92csz.com/study/linux/6.htm 绝对路径:路径的写法一定由根目录”/”写起 相对路径:路径的写法不是由根目录”/”写起 mkdir 创建一个目录.mkdi ...

  2. PHP入门(四)

    1.数组 1. array() 函数用于创建数组 在 PHP 中,有三种类型的数组:数值数组 - 带有数字 ID 键的数组 关联数组 - 带有指定的键的数组,每个键关联一个值 多维数组 - 包含一个或 ...

  3. 1.端口被占用问题:Embedded servlet container failed to start. Port 8097 was already in use.

    1.端口被占用问题:Embedded servlet container failed to start. Port 8097 was already in use.netstat -anonetst ...

  4. postman添加测试

    我们有的时候可能需要登陆才能使用下面的接口 解决方案.在浏览器中找到cookie.然后放在postman中的Headers中

  5. MongoDB基本操作(增删改查)

    基本操作      基本的“增删查改“,在DOS环境下输入mongo命令打开shell,其实这个shell就是mongodb的客户端,同时也是一个js的编译器,默认连接的是“test”数据库.  

  6. rabbitmq 和 kafka 简单的性能测试

    测试环境:ubuntu 15.10 64位 cpu:inter core i7-4790 3.60GHZ * 8 内存:16GB 硬盘:ssd 120GB 软件环境:rabbmitmq 3.6.0   ...

  7. 2019hdu多校 K-th Closest Distance

    题目链接:Click here 大致题意:q次询问,每次询问你区间[L,R]中|p-ai|的值第k小的是多少 Solution: 直接找是很困难的,我们考虑二分答案,那么本题就十分简单了 我们对权值维 ...

  8. [CSP-S模拟测试]:数对(线段树优化DP)

    题目传送门(内部题96) 输入格式 第一行一个整数$n$,接下来$n$行每行三个整数$a_i,b_i,w_i$. 输出格式 一行一个整数表示最大权值和. 样例 样例输入: 54 4 12 3 31 5 ...

  9. html初体验#2

    碎碎念 关于布局 css布局:横向.纵向 2019年新进展:css grid git bash 上安装 http server 目的在于不使用 file:// 打开自己写的文件,使用 http:// ...

  10. 转载 用ShadowVolume画模型的影子

    阅读目录(Content) Shadow Volume 包围盒 动态生成包围盒 判断 多光源下的阴影 总结 问题 CSharpGL(48)用ShadowVolume画模型的影子 回到顶部(go to ...