写在前面

常见排序算法可以分为两大类:

  • 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。

  • 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。

排序复杂度

类别 名称 时间复杂度 稳定性
插入排序 插入排序(insertion sort) O(n2) 稳定
插入排序 希尔排序 (shell sort) O(nlogn) 不稳定
选择排序 选择排序(selection sort) O(n2) 不稳定
选择排序 堆排序 (heapsort) O(nlogn) 不稳定
交换排序 冒泡排序(bubble sort) O(n2) 稳定
交换排序 快速排序(quicksort) O(nlogn) 不稳定
归并排序 归并排序 (merge sort) O(nlogn) 稳定
基数排序 基数排序(radix sort) O(n+k) 稳定

冒泡排序

它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。

  1. def bubbleSort(nums):
  2. for i in range(len(nums) - 1):
  3. for j in range(len(nums) - i - 1):
  4. if nums[j] > nums[j + 1]:
  5. nums[j], nums[j + 1] = nums[j + 1], nums[j]
  6. return nums
  7. nums = [2, 1, 34, 4, 6, 3, 6]
  8. result = bubbleSort(nums)
  9. print(result)
  10. [1, 2, 3, 4, 6, 6, 34]

选择排序

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,

然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。

  1. def selectSort(nums):
  2. for i in range(len(nums) - 1):
  3. index = i
  4. for j in range(i + 1, len(nums)):
  5. if nums[j] < nums[index]:
  6. index = j
  7. if index != i:
  8. nums[i], nums[index] = nums[index], nums[i]
  9. return nums
  10. nums = [2, 1, 34, 4, 6, 3, 6]
  11. result = selectSort(nums)
  12. print(result)
  13. [1, 2, 3, 4, 6, 6, 34]

插入排序

每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

时间复杂度:O(n^2).

  1. def insertSort1(nums):
  2. for i in range(1, len(nums)):
  3. index = nums[i]
  4. j = i - 1
  5. while j >= 0 and nums[j] > index:
  6. nums[j+1] = nums[j]
  7. j-=1
  8. nums[j+1] = index
  9. return nums
  10. nums = [2, 4, 1 ,0, 4, 3, 2, 5]
  11. result = insertSort1(nums)
  12. print(result)
  13. [0, 1, 2, 2, 3, 4, 4, 5]

下面方法会遍历到nums[-1],如果nums[-1] > index则进行交换,但是循环结束,nums[0]仍会赋值为index

  1. def insertSort(nums):
  2. for i in range(1, len(nums)):
  3. index = nums[i]
  4. for j in range(i, -1, -1):
  5. if index < nums[j - 1]: #该方法会遍历到nums[-1],如果nums[-1] > index则进行交换,但是循环结束,nums[0]仍会赋值为index
  6. nums[j]= nums[j - 1]
  7. else:
  8. break
  9. nums[j] = index
  10. return nums
  11. nums = [2, 4, 1 ,0, 4, 3, 2, 5]
  12. result = insertSort(nums)
  13. print(result)
  14. [0, 1, 2, 2, 3, 4, 4, 5]

快速排序

快速排序原理是首先要找到一个中枢,把小于中枢的值放到他前面,

大于中枢的值放到他的右边,然后再以此方法对这两部分数据分别

进行快速排序。先看一下代码

时间复杂度:O(nlgn)

  1. def quickSort(nums,start,end):
  2. #判断low是否小于high,如果为false,直接返回
  3. if start < end:
  4. i,j = start,end
  5. #设置基准数
  6. base = nums[i]
  7. while i < j:
  8. #如果列表后边的数,比基准数大或相等,则前移一位直到有比基准数小的数出现
  9. while (i < j) and (nums[j] >= base):
  10. j = j - 1
  11. #如找到,则把第j个元素赋值给第个元素i,此时表中i,j个元素相等
  12. nums[i] = nums[j]
  13. #同样的方式比较前半区
  14. while (i < j) and (nums[i] <= base):
  15. i = i + 1
  16. nums[j] = nums[i]
  17. #做完第一轮比较之后,列表被分成了两个半区,并且i=j,需要将这个数设置回base
  18. nums[i] = base
  19. #递归前后半区
  20. quickSort(nums, start, i - 1)
  21. quickSort(nums, j + 1, end)
  22. return nums
  23. nums = [49,38,65,97,76,13,27,49]
  24. print("Quick Sort: ")
  25. quickSort(nums,0,len(nums)-1)
  26. print(nums)

持续更新中..,

【数据结构与算法】003—排序算法(Python)的更多相关文章

  1. 在Object-C中学习数据结构与算法之排序算法

    笔者在学习数据结构与算法时,尝试着将排序算法以动画的形式呈现出来更加方便理解记忆,本文配合Demo 在Object-C中学习数据结构与算法之排序算法阅读更佳. 目录 选择排序 冒泡排序 插入排序 快速 ...

  2. javascript数据结构与算法--高级排序算法

    javascript数据结构与算法--高级排序算法 高级排序算法是处理大型数据集的最高效排序算法,它是处理的数据集可以达到上百万个元素,而不仅仅是几百个或者几千个.现在我们来学习下2种高级排序算法-- ...

  3. javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法)

    javascript数据结构与算法--高级排序算法(快速排序法,希尔排序法) 一.快速排序算法 /* * 这个函数首先检查数组的长度是否为0.如果是,那么这个数组就不需要任何排序,函数直接返回. * ...

  4. javascript数据结构与算法--基本排序算法(冒泡、选择、排序)及效率比较

    javascript数据结构与算法--基本排序算法(冒泡.选择.排序)及效率比较 一.数组测试平台. javascript数据结构与算法--基本排序(封装基本数组的操作),封装常规数组操作的函数,比如 ...

  5. 数据结构与算法——常用排序算法及其Java实现

    冒泡排序 原理:依次比较相邻的两个数,将小数放在前面(左边),大数放在后面(右边),就像冒泡一样具体操作:第一趟,首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前 ...

  6. c/c++ 通用的(泛型)算法 之 只读算法,写算法,排序算法

    通用的(泛型)算法 之 只读算法,写算法,排序算法 只读算法: 函数名 功能描述 accumulate 求容器里元素的和 equal 比较2个容器里的元素 写算法 函数名 功能描述 fill 用给定值 ...

  7. JS中算法之排序算法

    1.基本排序算法 1.1.冒泡排序 它是最慢的排序算法之一. 1.不断比较相邻的两个元素,如果前一个比后一个大,则交换位置. 2.当比较完第一轮的时候最后一个元素应该是最大的一个. 3.按照步骤一的方 ...

  8. 数据结构与算法之排序算法(python实现)

    1.冒泡排序 冒泡排序的原理是依次比较相邻的两个数,如果前一个数比后一个数大则交换位置,这样一组比较下来会得到该组最大的那个数,并且已经放置在最后,下一轮用同样的方法可以得到次大的数,并且被放置在正确 ...

  9. 数据结构Java版之排序算法(二)

    排序按时间复杂度和空间复杂度可分为 低级排序 和 高级排序 算法两种.下面将对排序算法进行讲解,以及样例的展示. 低级排序:冒泡排序.选择排序.插入排序. 冒泡排序: 核心思想,小的数往前移.假设最小 ...

随机推荐

  1. ecloipse背景修改豆沙

    Eclipse背景色的修改 Eclipse背景色的修改,修改为豆沙色  值是85 123 205 一.修改编辑区   ①这个比较简单一般都会不多说. 1.首先点击Window 然后选择Preferen ...

  2. 报表导出excel方式介绍

     报表导出excel提供了四种方式,在单元格属性"其他/导出excel方式"可以选择,如下图 一是导出缺省值:报表中的单元格包含两个值,一个真实值一个显示值,但是在excel中 ...

  3. Android如何使用WebView访问https的网站

    Android中可以用WebView来访问http和https的网站,但是默认访问https网站时,假如证书不被Android承认,会出现空白页面,且不会有任何提示信息,这时我们必须加多一些配置. 此 ...

  4. qt cmake

    写在前面的话:强烈建议优先阅读Qt官网文档对cmake的使用介绍——CMake Manual 前言我去年用clion写Qt的时候,找了很多教程,也没有什么让我觉得很满意的.后来自己摸索,构建了一个我自 ...

  5. .net core 配置swagger遇到的坑

    Swagger能成为最受欢迎的REST APIs文档生成工具之一,有以下几个原因: Swagger 可以生成一个具有互动性的API控制台,开发者可以用来快速学习和尝试API. Swagger 可以生成 ...

  6. asp.net 對象圖解

  7. .net验证是否合法邮箱和ip地址的方式

    通常情况下第一时间会想到使用正则表达式去验证,但由于正则表达式过于复杂或者没有考虑到某些情况,从而导致问题或者判断的效率低.下面通过另一种方式去判断. 判断是否合法邮箱: /// <summar ...

  8. 转:linux的fatab文件详解

    /etc/fstab是用来存放文件系统的静态信息的文件.位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改. 当系统启 ...

  9. Python入门-模块1(模块导入与time模块)

    ---恢复内容开始--- 模块 一.模块分类: 模块分为三种: 1.内置模块:Python自带的标准模块(可使用help('modules’)查看Python自带模块列表) 2.第三方开源模块:可以通 ...

  10. 缓存知识整理(包含Redis)

    一.缓存知识 1.buffer和cache的区别 Buffer 缓冲 写操作 写缓冲    Cache 缓存 读操作 读缓存 磁盘-->内存-->CPU 2.PHP的缓存方案 官方文档:h ...