(自己手打的python实现代码以及整理的各路大神总结的知识点)

自用学习笔记,由于基于北美cs学习,文章大量中英混杂(谨慎食用)

十大排序算法:

插入排序

1)Insertion Sort 简单插入排序:

2)Shell sort(希尔排序):突破n^2

交换排序

3)Bubble sort:两两比较

4)Quicksort

选择排序

5)Selection Sort选择排序:选出最小的

6)Heap sort (堆排序,二叉树的代言人):

稳定的nlog,平常一般不用,常数太大

归并排序

7)Merge sort(分治DC的典型代表)

非比较类排序:

8)Counting sort 计数排序:平凡的线性counting/排序

9)Radix Sort 基数排序

10)Bucket Sort 桶排序

Time complexity vs Space Complexity

  1. 时间复杂度:表示的是计算机的操作次数, 用Big O notation表示

常见的 time complexity 复杂度量级(从快到慢)

  • O(1)【无论代码多长,只要没有循环】
  • O(logN)【ie. for i<n, i=i*2 等价于共循环x次,且2^x =n】
  • O(n)【for里循环n遍】
  • O(nlogN)【在2)的基础上循环n遍】
  • O(n^2)【把O(n)再嵌套循环一次】
  • O(n^3)
  • O(n^k)
  • O(2^n)【ie. T(0) = T(1) = 1,同时 T(n) = T(n - 1) + T(n - 2) + 1,斐波那契数列(Fibonacci sequence)通过归纳证明法可以证明,当 n >= 1 时 T(n) < (5/3)^n,同时当 n > 4 时 T(n) >= (3/2)^n。所以可以表示为 O((5/3)^n),简化后为 O(2^n)。】

2.空间复杂度:算法运行过程中临时占用内存储蓄空间大小的一个度量

3.稳定:如果a=b,a原本在b前面,排序之后a仍然在b的前面。

4.不稳定:如果a=b,a原本在b的前面,排序之后 a 可能会出现在 b 的后面

1.插入排序

1)Insertion Sort:简单插入排序

idea: 模拟扑克牌理牌的归类思路

时间复杂度

  • 平均:O(n^2) (每轮操作O(n)次,共O(n)轮)
  • worst:O(n^2)
  • best: O(n)

稳定性:稳定

适用于: 处理数据量比较少且基本有序的数据

process: 从第二个元素开始,与左边的第一个元素比较,如果比#1元素小,则插在#1的左边;如果比#1元素大,则无需移动,直接进行到#3开始比较,此时前面有两个元素,从最靠近的开始比较,如果比谁大就插入在谁的右边

python 实现代码如下:

2)Shell Sort 希尔排序

idea:插入排序的改进版,把较大的数据集合逻辑上分割(并没有实际分组操作)成若干个小组,然后对每个小组分别进行插入排序,即多了一个增量(gap)以及增量序列

适用于:中等规模数据

稳定性: 不稳定

时间复杂度:

  • 平均: O(n^1.3)
  • worst:O(n^2) 增量序列为 {1,2,4,8.....}
  • best:O(n)
图源水印

python 实现代码如下:

process:增量的存在是将index相差增量的分到一组

比如arr :5,7,8,3,1,2,4,6

[index: 0,1,2,3,4,5,6,7]

length = 8, 这个的gap = 4,

此时a[0],a[4]一组,a[1],a[5]一组,...每个组进行insertion sort

for i in range(gap, n) - for i in range(4, 8):选定index为4,5,6,7的数

lst[i - gap]: index4,5,6,7的分别对应index0,1,2,3

如果index在前面的value大,就换位置,这一轮排序完为

1,2,4,3,5,7,8,6

然后继续缩小增量

第二轮的增量为 gap//=2 为2, 则又变遍历一次for i in range(gap, n) - for i in range(2, 8)

此时为a[0],a[2],a[4],a[6]一组,a[1],a[3],a[5],a[7]一组,每个组进行insertion sort

lst[i - gap] > lst[i]:a[0]先和a[2]比,

  • 如果a[2]比a[0]大则跳出while 继续遍历for:开始a[1]和a[3]比,a[2]和a[4]比....(每轮每个组轮流来一个,不是先完成一个组再进行另一个组
  • 如果a[0]比a[2]大则交换,i -=gap 的存在原理即为insertion sorting:在本组内,和前面所有元素比,以保证这个元素比左边的所有元素大,则跳出while继续for

直到 i - gap <0 停止(因为是从index大的顺着gap找index小的对应,如果i-dex小于0则表示已经遍历所有了

其他代码实现详情可见https://mp.weixin.qq.com/s/4kJdzLB7qO1sES2FEW0Low

交换排序

1. Bubble sort

  • idea: 比较相邻的元素,如果前面的大则交换;针对所有元素重复上述步骤,除了最后一个。即对n个数据操作n-1轮,每轮找出一个最大值(会被移到最后面)
  • 时间复杂度:O(n^2)【(n-1)+(n-2)+....+1= n(n-1)/2,等差数列求和,去掉常数系数】(平均=worst), O(n) (best)
  • 稳定性:稳定
  • python 代码实现:

2. Quick Sort

idea: 选择一个数作为pivot,把小于这个数的放在左边,大于这个数的放在右边,然后再继续进行分割(partition)和递归(recurision)

时间复杂度:

  • O( n

    N)(平均&Best)
  • O(n^2) worst

稳定性:不稳定

python 代码实现:

未完待续。。

9个元素换6次达到排序序列_十大算法排序(Sorting Algorithm) Study notes相关推荐

  1. python经典排序_python实现十大经典排序算法

    写在前面 本文参考十大经典排序算法(动图演示),这篇文章有动图显示,介绍的很详细.本文是部分内容有借鉴此博客,用python实现,有一些改进. 各种算法的时间.空间复杂度 1.冒泡排序 1.比较相邻的 ...

  2. 按复杂度有效性递减排序_十大经典排序算法:python源码实现,通俗深入讲解

    概述 提示:本文上万字,陆陆续续疏理知识点加测试代码,耗时近一个月.阅读时长40分钟左右. 本文将十大经典排序算法进行汇总,从源码实现.复杂度.稳定性进行分析,并对每种排序的特性进行点评.对典型算法, ...

  3. 冒泡和快速排序的时间复杂度_十大经典排序算法——快速排序

    目录 1.1.排序分类 1.2.排序的定义: 对一序列对象根据某个关键字进行排序. 1.3.术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面. 不稳定:如果a原本在b的前面,而a ...

  4. 张仰彪第二排序法_十大排序之冒泡和选择排序

    你好,我是goldsunC 让我们一起进步吧! 排序 所谓排序,就是指将一组数据,按照特定规则调换位置,使数据具有某种顺序关系(递增或递减).在排序过程中,数据的移动方式可分为直接移动和逻辑移动两种. ...

  5. 中希尔排序例题代码_十大经典排序算法最强总结

    排序算法属于经典基础算法基本功,笔试面试基本都会涉及和考察的,有原题也有变化,不过基础的几大排序算法还是得尽可能熟悉,能在思路熟悉的前提下手写出代码就更好了. ❝为了防止不提供原网址的转载,特加原文链 ...

  6. 希尔排序是一种稳定的排序算法_十大经典排序算法——希尔排序

    vs code ppt c++/java 目录 1.1.排序分类 1.2.排序的定义: 对一序列对象根据某个关键字进行排序. 1.3.术语说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的 ...

  7. 输入十个数进行排序_十大经典排序算法(Javascript描述)

    "本文13906字,阅读大约需要35分钟." 这世界上总存在着那么一些看似相似但有完全不同的东西,比如雷锋和雷峰塔,小平和小平头,玛丽和马里奥,Java和Javascript... ...

  8. 极客算法训练笔记(六),十大经典排序之希尔排序,快速排序

    目录 抛砖引玉 希尔排序 快速排序 抛砖引玉 十大经典排序算法江山图 十大经典排序算法江山图 排序算法的衡量指标我这里不再重复,上一篇我已经列举分析的很清楚了,但是非常重要,没看到我上一篇的小伙伴墙裂 ...

  9. 9个元素换6次达到排序序列_原创系列 |冒泡排序提升为快速排序,都发生了什么?...

    「Python与算法社区」 第 310 篇原创 " 1 你会学到什么? " 彻底弄明白常用的排序算法的基本思想,算法的时间和空间复杂度,以及如何选择这些排序算法,确定要解决的问题的 ...

最新文章

  1. python列表表示二叉树_python-产生二叉树的所有从根到叶的分支
  2. [20180627]测试bbed是否支持管道命令.txt
  3. FLASH基础概念 [一]
  4. C语言函数指针(结构体函数指针)
  5. redisson的锁的类型_你知道吗?大家都在使用Redisson实现分布式锁了!!
  6. 界面设计方法(2)— 5.功能按钮设计(新增,查询)
  7. jedis访问redis学习笔记
  8. linux下重启tomcat,日志查看
  9. 基于单片机的贪吃蛇游戏设计仿真
  10. oracle数据存入临时表,ORACLE数据库临时表总结
  11. 三体中的思想实验二:黑暗森林(上)
  12. 雷神simplest_ffmpeg_player解析(一)
  13. 一个Word中的样式导入另一个Word
  14. mysql 查询分析器_mysql查询分析工具|mysql查询分析器(MySQL Query Browser)下载v1.1.20 官方版_ IT猫扑网...
  15. Oracle执行UPDATE语句的步骤
  16. finereport激活码
  17. 测验六python编程题,Python编程第六章习题.py
  18. 折腾笔记--Linux和Windows10双系统安装的一般步骤(通用)(物理机安装)
  19. 人的一生七八十年,到底该如何度过?
  20. Java: Integer比较127, 128

热门文章

  1. 前端月趋势榜:6 月新增的、最热门的 20 个前端开源项目 - 2106
  2. Jenkins构建项目,JAVA_HOME is not defined correctly
  3. sass学习记录及vue实践
  4. 一篇文章教你读懂Spring @Conditional注解
  5. linux命令--VI命令详解(一)
  6. linux fedora自定义终端terminal的快捷键
  7. 【收藏】部署Kubernetes(k8s)时,为什么要关闭swap、selinux、防火墙?
  8. 【收藏】wiztree大文件查找软件
  9. java gui编程:swing创建窗体和进度条代码示例
  10. Webpack安装及打包js、css文件示例