本系列算法整理自:https://github.com/hustcc/JS-Sorting-Algorithm
动图演示:https://www.runoob.com/w3cnote/ten-sorting-algorithm.html

排序算法是《数据结构与算法》中最基本的算法之一。

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。

常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:

复杂度

主要还是从算法所占用的「时间」和「空间」两个维度去考量。

时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。
空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。

参考:https://zhuanlan.zhihu.com/p/50479555

关于时间复杂度

平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。

线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序;

O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序

线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。

关于稳定性

稳定性的定义

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。

不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。

名词解释:

n:数据规模
k:"桶"的个数
In-place:占用常数内存,不占用额外内存
Out-place:占用额外内存
稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同

python

'''
# Create by LokiSharp(loki.sharp#gmail) at 2017-1-22
'''TOTAL = 5000def sortTest(func, total=1000):import random, copy, operator, math, timearrList = [i for i in range(-math.floor(total / 2), math.ceil(total / 2))]arrListR = copy.deepcopy(arrList)while operator.eq(arrList, arrListR):random.shuffle(arrListR)# print("--- [Origin List]", arrList, "Use", func.__name__,"with Total:", len(arrList))# print("--> [Random List]", arrListR, "Use", func.__name__,"with Total:", len(arrList))start = time.clock()arrListR = func(arrListR)end = time.clock()runtime = end - start# print("--> [Sorted List]", arrListR, "Use", func.__name__,"with Total:", len(arrList))if operator.eq(arrList, arrListR):print("[Success]", func.__name__, "with Total:", len(arrList), "in %.5fs" % runtime)return Trueelse:print("[Fail]", func.__name__, "with Total:", len(arrList), "in %.5fs" % runtime)return Falsedef bubbleSort(arr):for i in range(1, len(arr)):for j in range(0, len(arr) - i):if arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]return arrdef selectionSort(arr):for i in range(len(arr) - 1):# 记录最小数的索引minIndex = ifor j in range(i + 1, len(arr)):if arr[j] < arr[minIndex]:minIndex = j# i 不是最小数时,将 i 和最小数进行交换if i != minIndex:arr[i], arr[minIndex] = arr[minIndex], arr[i]return arrdef insertionSort(arr):for i in range(len(arr)):preIndex = i - 1current = arr[i]while preIndex >= 0 and arr[preIndex] > current:arr[preIndex + 1] = arr[preIndex]preIndex -= 1arr[preIndex + 1] = currentreturn arrdef shellSort(arr):import mathgap = 1while (gap < len(arr) / 3):gap = gap * 3 + 1while gap > 0:for i in range(gap, len(arr)):temp = arr[i]j = i - gapwhile j >= 0 and arr[j] > temp:arr[j + gap] = arr[j]j -= gaparr[j + gap] = tempgap = math.floor(gap / 3)return arrdef mergeSort(arr):import mathif (len(arr) < 2):return arrmiddle = math.floor(len(arr) / 2)left, right = arr[0:middle], arr[middle:]return merge(mergeSort(left), mergeSort(right))def merge(left, right):result = []while left and right:if left[0] <= right[0]:result.append(left.pop(0));else:result.append(right.pop(0));while left:result.append(left.pop(0));while right:result.append(right.pop(0));return resultdef quickSort(arr, left=None, right=None):left = 0 if not isinstance(left, (int, float)) else leftright = len(arr) - 1 if not isinstance(right, (int, float)) else rightif left < right:partitionIndex = partition(arr, left, right)quickSort(arr, left, partitionIndex - 1)quickSort(arr, partitionIndex + 1, right)return arrdef partition(arr, left, right):pivot = leftindex = pivot + 1i = indexwhile i <= right:if arr[i] < arr[pivot]:swap(arr, i, index)index += 1i += 1swap(arr, pivot, index - 1)return index - 1def swap(arr, i, j):arr[i], arr[j] = arr[j], arr[i]def buildMaxHeap(arr):import mathfor i in range(math.floor(len(arr) / 2), -1, -1):heapify(arr, i)def heapify(arr, i):left = 2 * i + 1right = 2 * i + 2largest = iif left < arrLen and arr[left] > arr[largest]:largest = leftif right < arrLen and arr[right] > arr[largest]:largest = rightif largest != i:swap(arr, i, largest)heapify(arr, largest)def swap(arr, i, j):arr[i], arr[j] = arr[j], arr[i]def heapSort(arr):global arrLenarrLen = len(arr)buildMaxHeap(arr)for i in range(len(arr) - 1, 0, -1):swap(arr, 0, i)arrLen -= 1heapify(arr, 0)return arrdef countingSort(arr, maxValue=None):bucketLen = maxValue + 1bucket = [0] * bucketLensortedIndex = 0arrLen = len(arr)for i in range(arrLen):if not bucket[arr[i]]:bucket[arr[i]] = 0bucket[arr[i]] += 1for j in range(bucketLen):while bucket[j] > 0:arr[sortedIndex] = jsortedIndex += 1bucket[j] -= 1return arrdef radix_count(exp1):global listn = len(list)output = [0] * (n)count = [0] * (10)for i in range(0, n):index = (list[i] / exp1)count[(index) % 10] += 1for i in range(1,10):count[i] += count[i - 1]i = n - 1while i >= 0:index = (list[i]/exp1)output[count[(index) % 10] - 1] = list[i]count[(index) % 10] -= 1i -= 1i = 0for i in range(0,len(list)):list[i] = output[i]def radixSort():global listmax1 = max(list)exp = 1while max1 / exp > 0:radix_count(exp)exp *= 10if __name__ == '__main__':sortTest(bubbleSort, TOTAL)sortTest(selectionSort, TOTAL)sortTest(insertionSort, TOTAL)sortTest(shellSort, TOTAL)sortTest(mergeSort, TOTAL)sortTest(quickSort, TOTAL)sortTest(heapSort, TOTAL)sortTest(radixSort, TOTAL)

十大经典排序算法与算法复杂度相关推荐

  1. 十大经典排序算法动画与解析,看我就够了

    作者 | 程序员小吴 转载自五分钟学算法(ID: CXYxiaowu) 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序.内部排序是数据记录在内存中进行 ...

  2. 十大经典排序算法(建议收藏)

    来自:Damonare的个人博客 原文:http://blog.damonare.cn/2016/12/20/十大经典排序算法总结(javascript描述)/ 0.算法概述  0.1 算法分类 十种 ...

  3. 11月14日云栖精选夜读 | 动画+原理+代码,解读十大经典排序算法

    排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过 ...

  4. 数据结构与算法笔记 —— 十大经典排序及算法的稳定性

    一.十大经典排序算法 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全 ...

  5. Algorithm:【Algorithm算法进阶之路】之十大经典排序算法

    Algorithm:[Algorithm算法进阶之路]之十大经典排序算法 相关文章 Algorithm:[Algorithm算法进阶之路]之数据结构二十多种算法演示 Algorithm:[Algori ...

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

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

  7. 十大经典排序算法总结(够兄弟们喝一壶的)

    Ⅰ.十大经典排序算法之插入排序及其二分优化:https://blog.csdn.net/Kevinnsm/article/details/114403557 Ⅱ.十大经典排序算法之冒泡排序及其优化:h ...

  8. 教小学妹学算法:十大经典排序算法深度解析

    最近有一位小学妹 Coco 入坑了算法,结果上来就被几个排序算法给整懵逼了,各种排序眼花缭乱,也分不清什么时候该用什么排序了. 今天呢,就在这分享一下我给小学妹讲十大经典排序算法的过程. 好吧,那我们 ...

  9. 【完整可运行源码+GIF动画演示】十大经典排序算法系列——冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

    以前也零零碎碎发过一些排序算法,但总是不系统, 这次彻底的对排序系列做了一个整体的规划, 小伙伴们快快mark哦~ [GIF动画+完整可运行源代码]C++实现 冒泡排序--十大经典排序算法之一 [GI ...

  10. 【GIF动画+完整可运行源代码】C++实现 基数排序——十大经典排序算法之十

    十大经典排序算法系列博客-->传送门 基数排序是按照低位先排序,然后收集:再按照高位排序,然后再收集:依次类推,直到最高位.有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序.最 ...

最新文章

  1. mini mysql_mini
  2. 深入理解 C 指针阅读笔记 -- 第六章
  3. 阿里云Ubuntu 14.04 + Nginx + let's encrypt 搭建https访问
  4. centos6.8下安装破解quartus prime16.0以及modelsim ae安装
  5. python dtype什么意思_DataFrame中的字符串,但dtype是对象
  6. go语言的map以及红黑树的map
  7. 视频翻录_将DVD解密并复制到硬盘驱动器而无需翻录
  8. 读取nas_NAS怎么玩?除了存放小姐姐,它竟然还有这些功能
  9. 每个Linux用户都应该了解的命令行省时技巧
  10. 剑指offer面试题68 - II. 二叉树的最近公共祖先(递归)
  11. 德国计算机专业英语授课,德国留学——细数德国亚琛工大的英语授课硕士专业...
  12. C# 纯真数据库读取
  13. Python爬取微博数据
  14. 码率和帧率的含义及区别
  15. 分享一个查看U盘闪存的工具,SA们别买到假货了!
  16. 锐捷无线网络优化 之 精准配置无线接入点发射功率
  17. 蓝湖怎么切图标注_如何用蓝湖做自动标注 ?
  18. 显卡使用信息nvidia-smi命令
  19. 简单图+Havel_Hakimi定理
  20. fedora11 文泉驿micro-hei字体设置

热门文章

  1. 【劲峰论道时空分析技术-学习笔记】3 时空演化树
  2. Python 定时器制作
  3. ArcGIS操作小技巧(一)之属性表中显示出小数点前面的 0
  4. 实习成长之路:操作系统——CPU有哪些工作模式呢?
  5. 深入理解java虚拟机学习笔记(一)
  6. 社区活动 | Apache Flink Meetup·深圳站,锁定 Flink 最佳实践
  7. Android自定义View【实战教程】5⃣️---Canvas详解及代码绘制安卓机器人
  8. CTO 要我把这份 MySQL 规范贴在工位上!
  9. Google Exoplayer之全面认识
  10. 插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑