经典排序算法的零基础通俗讲解

一、几种经典排序算法的排序过程及时间复杂度

冒泡:时间复杂度O(n²)

第一个数和第二个数比较,大的放在后边,然后第二个数再和第三个数比较,大的放在后面。以此类推。

选择:时间复杂度O(n²):

0到n-1里找最小值放位置0上;1到n-1里找最小值放位置1上 以此类推

插入:时间复杂度O(n²)

一个数 和他前边的数比较 如果大于那个数就放在那个数后面 如果比那个数小就一直往前比较 直到比某个数大就放在那个数后面。如果都没有就放在首位置。

时间复杂度:O(N*logN) : 归并排序,快速排序,堆排序,希尔排序。

归并排序:4 6 8 1 7 3 5 2   先每个数自己一组

然后相邻的成为一组: 46 81 73 52 组里边排序 46 18 37 25

然后相邻的组成为一组: 4618 3725 组里边排序 1468 2357

然后再相邻的成为一组:14682357 组里边排序 12345678

快速排序

随机选中一个数,小于等于它的数放在 这个数的左边 大于它的数 放在这个数的右边

接下来对 左右两个部分 分别的递归的调用快速排序

堆排序

把数组中n个元素建立成大小为n的大根堆,堆顶是整个所有元素的最大值,把堆顶的元素和堆的最后一个位置的元素位置进行交换。然后把最大值脱离出整个堆结构放在数组的最后位置。作为有序部分。

再把n-1大小的堆进行大根堆的调整,堆顶还是最大元素,再和最后一位数交换,然后脱离。

脱离出的数就是有序的 最大值们

希尔排序

插入排序改良的排序(插入排序步长为1)。希尔排序的步长是从大到小逐渐调整的。

比如步长为3,那么一个数就和他前面第三个数比较,比他大不动,比他小就继续再和他前面第三个数比较(如果有的话),直到比某个数大留在当前位置为止。

然后改变步长再比较。最终都会以步长为1的情况结束。

希尔排序的成败完全取决于步长的选择,步长选择越优时间复杂度越低,步长选择越劣越趋近于O(n²).

时间复杂度趋于O(N):都不是基于比较的排序算法(思想原型都来自桶排序)。

缺陷:区间太大的话,准备太多桶,造成大量空间浪费。

计数排序:

比如排序几个人的身高:先设置100厘米到300厘米的桶(100,101,102......300)。

然后把相应身高的人放进桶里。然后从100号桶依次倒出元素。员工被倒出的顺序就是身高的顺序。

基数排序:

比如排序几个数:设置0到9号桶。

先按照个位上的数放入相应桶中,再从0号桶到9号桶依次倒出所有的数。

再按十位放入;再按百位放入........

最后倒出来的数就有序了。

二、其他补充

空间复杂度:

O(1):插入排序,选择排序,冒泡排序,堆排序,希尔排序。

O(logN)~O(N):快速排序。

O(N):归并排序。

O(M):计数排序,基数排序。(M是选择桶的数量)

稳定性:相同值的元素 在经过排序后相对次序保持不变。

稳定的排序算法:

冒泡排序,插入排序,归并排序,计数排序,基数排序,桶排序。

不稳定的排序算法:

选择排序,快速排序,希尔排序,堆排序。

工程上的排序:

1.工程上的排序是综合排序。

2.数组较小时,使用插入排序。

3.数组较大时,使用快速排序或其他O(N*logN)的排序。

本贴是对左程云老师排序算法讲解的学习整理,该整理为本人原创不得以任何形式转载。

时间: 2024-11-10 11:06:55

经典排序算法的零基础通俗讲解的相关文章

常见经典排序算法学习总结,附算法原理及实现代码(插入、shell、冒泡、选择、归并、快排等)

博主在学习过程中深感基础的重要,经典排序算法是数据结构与算法学习过程中重要的一环,这里对笔试面试最常涉及到的7种排序算法(包括插入排序.希尔排序.选择排序.冒泡排序.快速排序.堆排序.归并排序)进行了详解.每一种算法都有基本介绍.算法原理分析.算法代码. 转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/47280135 插入排序 1)算法简介 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过

python 十大经典排序算法

python 十大经典排序算法 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存.常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 关于时间复杂度: 平方阶 (O(n2)) 排序 各类简单排序:直接插入.直接选择和冒泡排序. 线性对数阶 (O(nlog2n)) 排序 快速排序.堆排序和归并排序. O(n1+§)) 排序,§

七种经典排序算法最全攻略

经典排序算法在面试中占有很大的比重,也是基础.包括冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序.希望能帮助到有需要的同学.全部程序采用JAVA实现. 本篇博客所有排序实现均默认从小到大. 一.冒泡排序 BubbleSort 介绍: 冒泡排序的原理非常简单,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来. 步骤: 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对第0个到第n-1个数据做同样的工作.这时,最大的数就"浮"到了

经典排序算法 - 图书馆排序(Library Sort)

经典排序算法 - 图书馆排序(Library Sort) 思路简介,大概意思是说,排列图书时,如果在每本书之间留一定的空隙,那么在进行插入时就有可能会少移动一些书,说白了就是在插入排序的基础上,给书与书之间留一定的空隙,这个空隙越大,需要移动的书就越少,这是它的思路,用空间换时间 看红线标的那句话知道,这个空隙留多大,你自己定 图书馆排序的关键是分配空间,分配完空间后直接使用插入排序即可 进行空间分配的过程 这个我实在是找不到相关的资料,没准就是平均分配嘞 进行插入排序的过程 举例待排数组[ 0

经典排序算法 - Proxmap Sort

经典排序算法 - Proxmap Sort 这个排序是桶排序和基数排序的改进,理解了前两者,这个排序很容易理解 先回忆下桶排序是怎么回事,它与桶的区别在于入桶规则,桶排序里是1入1号桶,2入2号桶 这个排序把数字分区了,然后给出一个所谓的键,例如它规定0-9都入0号桶 10-19都入1号桶,这样桶覆盖的范围将增大10倍,这在某种情况下是很有用的 有了桶排的基础后,再看下边两张图就什么都明白了,不再分解过程了 图1 图2

经典排序算法总结与实现 ---python

原文:http://wuchong.me/blog/2014/02/09/algorithm-sort-summary/ 经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,在寒假里整理并用Python实现了七大经典排序算法,包括冒泡排序,插入排序,选择排序,希尔排序,归并排序,快速排序,堆排序.希望能帮助到有需要的同学.之所以用Python实现,主要是因为它更接近伪代码,能用更少的代码实现算法,更利于理解. 本篇博客所有排序实现均默认从小到大. 一.冒泡排序 BubbleSort 介绍

【最全】经典排序算法(C语言)

本文章包括所有基本排序算法(和其中一些算法的改进算法): 直接插入排序.希尔排序.直接选择排序.堆排序.冒泡排序.快速排序.归并排序.基数排序. 算法复杂度比较: 算法分类 一.直接插入排序 一个插入排序是另一种简单排序,它的思路是:每次从未排好的序列中选出第一个元素插入到已排好的序列中. 它的算法步骤可以大致归纳如下: 从未排好的序列中拿出首元素,并把它赋值给temp变量: 从排好的序列中,依次与temp进行比较,如果元素比temp大,则将元素后移(实际上放置temp的元素位置已经空出) 直到

java实现经典排序算法

前言 博主最近在恶补基础知识,算法必然是必不可少的,那么就从经典排序算法开始吧!(图源网络,侵删),没有列出全部,因为在期末考试囧 代码太多,就只显示了最关键的部分 1. 冒泡排序 实现思路: (1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换. (2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就"沉"到数组第 N-1个位置. (3)N=N-1,如果N不为 0就重复前面二步,否则排序完成. 这也是博主接触到的第一个排序算法 public

经典排序算法 - 冒泡排序Bubble sort

 原文出自于 http://www.cnblogs.com/kkun/archive/2011/11/23/bubble_sort.html 经典排序算法 - 冒泡排序Bubble sort 原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似看例子 例子为从小到大排序, 原始待排序数组| 6 | 2 | 4 | 1 | 5 | 9 | 第一趟排序(外循环) 第