写在前面:

参考文章:十大经典排序算法 本文的逻辑顺序基于从第一篇参考博文上借鉴过来的图,并且都是按照升序排序写的程序,程序语言采用python


思路:

冒泡排序的基本思想就是让小的数逐渐‘浮上来’。也就是说:

  • 第一次冒泡:将最小的数调换到最前面;

  • 第二次冒泡:将第二小的数调换到最小的数的后面,也就是数组中的第二位;

  • 第三次冒泡,将第三小的数调换到数组中的第三位;

    ... ...

代码如下:

# 冒泡排序
def bubble_sort(nums):
# 每次冒泡,将最大的元素冒到最后面
# 第一次是前n个元素,最大的元素冒到最后
# 第二次是前n-1个元素,最大的元素冒到倒数第二个位置
# ... ...
n = len(nums)
for i in range(n-1):
for j in range(0,n-i-1):
if nums[j]>nums[j+1]:
nums[j], nums[j+1] = nums[j+1],nums[j] return nums

时间复杂度: O(n^2),实际上是n-1 + n-2 + n-3 + ...,所以是平方的量级。

空间复杂度: O(l),没有借助额外空间。


快速排序

参考:快速排序的四种写法(python实现)

思路

快速排序的基本思路就是在一遍快排中,以基准值为基础,将比基准值小的数放到基准值的左边,比基准值大的数放在基准值的右边。然后在递归的快排基准值的左边和右边。至于基准值的取法,理论上来讲是无所谓的。

先来一个比较简单直接的吧。它的思路就是遍历一遍数组,用两个空的数组来存储比基准值大和比基准值小的数,代码如下:

def quick_sort1(nums):
n = len(nums)
if n ==1 or len(nums)==0:
return nums
left = []
right = []
for i in range(1,n):
if nums[i] <= nums[0]:
left.append(nums[i])
else:
right.append(nums[i])
return quick_sort1(left)+[nums[0]]+quick_sort1(right)

上面的使用了额外的空间,空间复杂度比较高,下面是基于双指针的想法的代码,比较常见:

def quick_sort2(nums,left,right):
l,r = left,right-1
while l < r:
if nums[r] < nums[l]:
nums[r], nums[l] = nums[l], nums[r]
l += 1
while l < r:
if nums[l] > nums[r]:
nums[r],nums[l] = nums[l], nums[r]
r -= 1
break
else:
l += 1
else:
r -= 1
if l-left > 1:
quick_sort2(nums, left, l)
if right - r > 1:
quick_sort2(nums, l+1, right)
return nums

在上面博客中看到的第三种方法,甚是巧妙,代码如下:

def quick_sort3(nums, l, r):
if l < r:
q = partition(nums, l, r)
quick_sort(nums, l, q - 1)
quick_sort(nums, q + 1, r)
return nums
def partition(nums, l, r):
x = nums[r]
i = l - 1
for j in range(l, r):
if nums[j] <= x:
i += 1
nums[i], nums[j] = nums[j], nums[i]
nums[i + 1], nums[r] = nums[r], nums[i+1]
return i + 1

简单插入排序

插入排序,意思是将某一个数字插入到已经排好序的数组当中。

代码如下:

def insert_sort(nums):
n = len(nums)
for i in range(1,n):
index = i
for j in range(i-1,-1,-1):
if nums[j] > nums[index]:
nums[index],nums[j] = nums[j],nums[index]
index -= 1
else:
break
return nums

希尔排序


简单选择排序

简单选择排序,就是每一次选择一个当前最小的元素放在已经排好序的数组的后面。

def selection_sort(nums):
n = len(nums)
for i in range(n):
index = i
for j in range(i+1,n):
if nums[j]<nums[index]:
index = j
nums[i],nums[index] = nums[index],nums[i] return nums

堆排序

def head_sort(elems):
def siftdown(elems,e,begin,end):
i, j = begin, begin*2+1
while j < end:
if j+1 < end and elems[j+1] < elems[j]:
j += 1
if e < elems[j]:
break
elems[i] = elems[j]
i, j = j, 2*j+1
elems[i] = e end = len(elems)
for i in range(end//2, -1, -1):
siftdown(elems, elems[i], i, end)
for i in range((end-1), 0, -1):
e = elems[i]
elems[i] = elems[0]
siftdown(elems, e, 0, i) nums.reverse()
return nums

二路归并排序


多路归并排序


计数排序


桶排序


基数排序


十大排序代码实现(python)的更多相关文章

  1. 一篇夯实一个知识点系列--python实现十大排序算法

    写在前面 排序是查找是算法中最重要的两个概念,我们大多数情况下都在进行查找和排序.科学家们穷尽努力,想使得排序和查找能够更加快速.本篇文章用Python实现十大排序算法. 干货儿 排序算法从不同维度可 ...

  2. 十大排序算法总结(Python3实现)

    十大排序算法总结(Python3实现) 本文链接:https://blog.csdn.net/aiya_aiya_/article/details/79846380 目录 一.概述 二.算法简介及代码 ...

  3. 十大排序算法JavaScript实现总结

    花费了几周的时间断断续续的练习和模仿与使用JavaScript代码实现了十大排序算法. 里面有每种算法的动图和静态图片演示,看到图片可以自己先按照图片的思路实现一下. github中正文链接,点击查看 ...

  4. Algorithm --> 十大排序算法

    十大排序算法 主要排序法有:  一.冒泡( Bubble)排序—— 相邻交换  二.选择排序 ——每次最小/ 大排在相应的位置  三.插入排序 ——将下一个插入已排好的序列中  四.壳( Shell) ...

  5. [ 转载 ] js十大排序算法:冒泡排序

    js十大排序算法:冒泡排序  http://www.cnblogs.com/beli/p/6297741.html

  6. 使用 js 实现十大排序算法: 快速排序

    使用 js 实现十大排序算法: 快速排序 QuickSort 快速排序 /** * * @author xgqfrms * @license MIT * @copyright xgqfrms * @c ...

  7. 使用 js 实现十大排序算法: 桶排序

    使用 js 实现十大排序算法: 桶排序 桶排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  8. 使用 js 实现十大排序算法: 计数排序

    使用 js 实现十大排序算法: 计数排序 计数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

  9. 使用 js 实现十大排序算法: 基数排序

    使用 js 实现十大排序算法: 基数排序 基数排序 refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!

随机推荐

  1. Xcode UI界面调试神器-injectionIII

    App Store搜索injectionIII下载即可,免费的哟. 打开injectionIII,运行即可. - (BOOL)application:(UIApplication *)applicat ...

  2. [LeetCode] 369. Plus One Linked List 链表加一运算

    Given a non-negative number represented as a singly linked list of digits, plus one to the number. T ...

  3. Kubernates之从pod中拷贝文件到宿主机

    想从k8s的pod中拷贝文件到宿主机,kubectl 的cp命令,但是网上搜索了下,感觉有点乱,自己记录下. hadoop这个namespace下,有个hadoop-hadoop-yarn-rm-0的 ...

  4. H2数据库介绍

    H2数据库是一个开源的关系型数据库. H2是一个采用java语言编写的嵌入式数据库引擎,只是一个类库(即只有一个 jar 文件),可以直接嵌入到应用项目中,不受平台的限制 应用场景: 可以同应用程序打 ...

  5. 如何在一个文件中写多个Vue组件(译-有删改)

    原文地址 Writing multiple Vue components in a single file 在一个文件中编写多个组件是React的模式,其中一些文件包含多个组件. 走开发过程中,有些组 ...

  6. 【剑指offer】面试题 22. 链表中倒数第 K 个节点

    面试题 22. 链表中倒数第 K 个节点

  7. java lambda怎么表达式判断被调用接口名称和接口中方法

    1.首先能够用于lambda表达式的只能是interface,并且interface 中只有一个方法. 这就说明,只要找到接口类型就能确定用的是哪个方法.(如下:intTypeInterface.St ...

  8. Java开发笔记(一百三十四)Swing的基本对话框

    桌面程序在运行过程中,时常需要在主界面之上弹出小窗,把某种消息告知用户,以便用户及时知晓并对症处理.这类小窗口通常称作对话框,依据消息交互的过程,可将对话框分为三类:消息对话框.确认对话框.输入对话框 ...

  9. docker 部署 nsq

    这篇文章主要介绍如何使用docker部署 nsq 组件 环境准备 本文基于一台 ubuntu 虚拟机试验 docker 安装 docker 安装方式 使用docker version 命令检查 doc ...

  10. Verilog的各种坑

    Verilog语言和软件语言不一样,有些时候理所当然的编写,也没有报语法错误,可是功能就是不对.唉,把遇到的坑都记在本篇博客吧. 1. initial begin...end里面不能有always,如 ...