`
tansitongba
  • 浏览: 484374 次
文章分类
社区版块
存档分类
最新评论

如何更快的理解简单的排序算法

 
阅读更多

一类:插入排序

插入排序法:

一.基本思想:输入一个元素,检查数组列表中的每个元素,将其插入到一个已经排好序的数列中的适当位置,使数列依然有序,当最后一个元素放入合适位置时,该数组排序完毕。

二.实例分析:

三.稳定性分析:稳定性:插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。

希尔排序法:

一.基本思想:属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序的方法(初次取序列的一半为增量,以后每次减半,直到增量为1

二.实例分析:

三.稳定性分析:稳定性:希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以shell排序是不稳定的。

二类:选择排序

选择排序:

一.基本思想:1趟简单选择排序是指通过n-1次关键字的比较,从n个记录中选出关键字最小的记录(记录),并和第1个记录进行交换。共需进行n-1趟比较,直到所有记录排序完成为止。

二.实例分析:

三.稳定性分析:稳定性:选择排序是给每个位置选择当前元素最小的,比如给第一个位置选择最小的,在剩余元素里面给第二个元素选择第二小的,依次类推,直到第n-1个元素,第n个元素不用选择了,因为只剩下它一个最大的元素了。那么,在一趟选择,如果当前元素比一个元素小,而该小的元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了。比较拗口,举个例子,序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法。

堆排序(HeapSort):

一.基本思想:

1.基本思想:
堆排序是一树形选择排序,在排序过程中,将R[1..N]看成是一颗完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系来选择最小的元素
2.
堆的定义:N个元素的序列K1,K2,K3,...,Kn.称为堆,当且仅当该序列满足特性:
Ki
K2iKiK2i+1(1I[N/2])

堆实质上是满足如下性质的完全二叉树:树中任一非叶子结点的关键字均大于等于其孩子结点的关键字。例如序列10,15,56,25,30,70就是一个堆,它对应的完全二叉树如上图所示。这种堆中根结点(称为堆顶)的关键字最小,我们把它称为小根堆。反之,若完全二叉树中任一非叶子结点的关键字均大于等于其孩子的关键字,则称之为大根堆。
3.排序过程:
堆排序正是利用小根堆(或大根堆)来选取当前无序区中关键字小(或最大)的记录实现排序的。我们不妨利用大根堆来排序。每一趟排序的基本操作是:将当前无序区调整为一个大根堆,选取关键字最大的堆顶记录,将它和无序区中的最后一个记录交换。这样,正好和直接选择排序相反,有序区是在原记录区的尾部形成并逐步向前扩大到整个记录区。

二.实例分析:

三.稳定性分析:稳定性:我们知道堆的结构是节点i的孩子为2*i和2*i+1节点,大顶堆要求父节点大于等于其2个子节点,小顶堆要求父节点小于等于其2个子节点。在一个长为n的序列,堆排序的过程是从第n/2开始和其子节点共3个值选择最大(大顶堆)或者最小(小顶堆),这3个元素之间的选择当然不会破坏稳定性。但当为n/2-1, n/2-2, ...1这些个父节点选择元素时,就会破坏稳定性。有可能第n/2个父节点交换把后面一个元素交换过去了,而第n/2-1个父节点把后面一个相同的元素没有交换,那么这2个相同的元素之间的稳定性就被破坏了。所以,堆排序不是稳定的排序算法

三类:交换排序

冒泡排序法:

一.基本思想:冒泡排序法理解:依次比较相邻两个数,将小数放在下面,大数放在上面。,即:首先比较第一个和第二个数,将小数置放下,大数放在上,循环依次,就可以找到最小值,放于末尾,再次循环,将数列排好。

二.实例分析:

三.稳定性分析:稳定性:冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,我想你是不会再无聊地把他们俩交换一下的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

快速排序法

一.基本思想:快速排序(分治思想)Quicksort)是对冒泡排序的一种改进,通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

二.实例分析:

三.稳定性分析:快速排序有两个方向,左边的i下标一直往右走,当a[i] <= a[center_index],其中center_index是中枢元素的数组下标,一般取为数组第0个元素。而右边的j下标一直往左走,当a[j] > a[center_index]。如果i和j都走不动了,i <= j, 交换a[i]和a[j],重复上面的过程,直到i>j。 交换a[j]和a[center_index],完成一趟快速排序。在中枢元素和a[j]交换的时候,很有可能把前面的元素的稳定性打乱,比如序列为 5 3 3 4 3 8 9 10 11, 现在中枢元素5和3(第5个元素,下标从1开始计)交换就会把元素3的稳定性打乱,所以快速排序是一个不稳定的排序算法,不稳定发生在中枢元素和a[j]交换的时刻。

四类:归并排序

一.基本思想:归并排序法(Merge Sort,以下简称MS)是分治法思想运用的一个典范。1n个元素分成两个含n/2元素的子序列;2MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列);3合并两个已排序好的序列。

二.实例分析:

三.稳定性分析:稳定性:归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素(认为直接有序)或者2个序列(1次比较和交换),然后把各个有序的段序列合并成一个有序的长序列,不断合并直到原序列全部排好序。可以发现,在1个或2个元素时,1个元素不会交换,2个元素如果大小相等也没有人故意交换,这不会破坏稳定性。那么,在短的有序序列合并的过程中,稳定是是否受到破坏?没有,合并过程中我们可以保证如果两个当前元素相等时,我们把处在前面的序列的元素保存在结果序列的前面,这样就保证了稳定性。所以,归并排序也是稳定的排序算法。

五类:基数排序

一.基本思想:根据数字的性质来逐个根据个位数、十位数、百位数分类求得进行分类。

二.实例分析:

三.稳定性分析:稳定性:基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序,最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以其是稳定的排序算法。

总结:以上是软考中常见的几种排序,其实还有一些排序没有写上,作为研究这几种排序最重要知道这种排序中运用的思想是什么,通过思想理解实例,那么理解排序就能事倍功半,其中排序的时间复杂度和空间复杂度自己没有写,因为这一部分自己也是靠记忆来知道的,具体想知道要从程序的角度来分析,感觉自己现在对着复杂度理解还有一段的距离,望谅解。

分享到:
评论

相关推荐

    C++语言的算法实现包括插入排序冒泡排序堆排序快速排序

    用C++语言实现的几个常见算法,里面有注解,方便大家理解,简单易学,都可以正常编译运行。

    数据结构的所有结构和排序算法简单理解有注释源码

    数据结构的所有结构和排序算法简单理解有注释源码,可以快速看懂此数据结构和排序算法的原理和注释,C语言版本

    冒泡排序、快速排序、简单插入排序、希尔排序、简单选择排序、堆叠排序六种排序方法.pdf

    冒泡排序、快速排序、简单插入排序、希尔排序、简单选择排序、堆叠排序六种数据结构必考的排序方式理解

    sorting_algorithms_py, 在 python 中,基本排序算法 简单.zip

    sorting_algorithms_py, 在 python 中,基本排序算法 简单 sorting_algorithms_py用 python 编写的基本排序算法。 代码简单易于理解。平均复杂度 !查看常见排序算法的平均 Big-O 复杂度:快速排序:O ( n log(n) )...

    常用排序算法C语言示例代码解说PDF

    个人原创总结的常用排序算法C语言示例代码解说PDF...包含有直接插入排序,折半插入排序,2路直接插入排序,起泡排序,简单选择排序,快速排序,堆排序,(希尔排序,归并排序,基数排序为空白),供学习排序算法的爱好者参考。

    排序算法包

    利用C++实现了常用的排序算法,包括:冒泡排序、插入排序、选择排序、归并排序、快速排序、0-交换排序。利用简单的数字序列排序为例,希望能帮助对以上算法有更深理解。

    【数据结构考研】九种内部排序算法代码及排序过程图示

    本资源包含《数据结构》考研的九种内部排序算法考点的算法代码及排序过程图示,以表格、图文方式详细讲解每一种排序算法的排序过程。 包含的九种内部排序有:直接插入排序、折半排序、希尔排序、冒泡排序、快速排序...

    重庆邮电大学数据结构实验报告八排序

    通过实验,帮助学生由浅入深地掌握各种简单排序和高级排序的基本思想,让他们比较其性能,也让他们更好地理解希尔排序和快速排序的方法。 1.任意输入一个数组并利用简单选择排序算法对此数组的元素按从大到小的顺序...

    C实现快速排序 quickSort

    在这个示例中,我们首先定义了一个swap函数用于交换数组中两个元素的值,以及一个partition函数用于对数组进行分区操作。然后定义了quickSort函数来实现...希望这个示例能帮助你理解如何在C语言中实现快速排序算法!

    数据结构四种排序算法

    数据结构课程设计的四种排序算法源程序,帮助理解排序算法

    算法设计与分析.rar

    要求:理解分治法的算法思想,清楚两路合并排序和快速排序算法的基本原理和实施过程,能将输入的一组无序序列排列为有序序列后输出。比较不同排序算法的时间/空间复杂度和改进方法。 动态规划法 内容:用动态规划法...

    基本排序方法程序(快速、冒泡、选择)

    选择排序、快速排序、冒泡排序三种基本排序方法的程序,vc6.0实现,思路清晰简单,注释详细易懂,通过对比可加深理解排序方法和原理。

    数据结构实践:10个核心课程设计实例,包括二叉树、排序算法

    3. **快速排序**:一种分治算法,通过选择一个“基准”值将数据分为两部分,一部分数据比基准值小,另一部分数据比基准值大,然后递归地对这两部分数据进行快速排序操作。 此外,该资源包还可能包含其他经典的数据...

    Python八大常见排序算法定义、实现及时间消耗效率分析

    快速排序入手来分析和实现,在最后也给出来了简单的时间统计,重在原理、算法基础,其他的次之,这些东西的熟练掌握不算是对之后的工作或者接下来的准备面试都是很有帮助的,算法重在理解内在含义和理论基础,在实现...

    JavaScript中几种常见排序算法小结

    这是一个非常快的排序方式,V8的sort方法就使用快速排序和插入排序的结合 希尔排序:在非chrome下数组长度小于1000,希尔排序比快速更快 系统方法:在forfox下系统的这个方法非常快 算法源码 代码如下: /

    C/C++实现双路快速排序算法原理

    首先说一下为什么需要双路排序,在有些带有许多重复数据的数组里,使用随机快速排序或者最简单的快速排序算法时,由于重复的数据会放在原来的索引位置不动,就回导致划分数组时划分的某一部分太长,起不到分段排序的...

    折半插入排序

    由于插入排序的基本操作是在一个有序表中进行查找和插入,这个“查找”操作可利用“折半查找”来实现,由此进行的...理解:依次将每个待排序的记录插入到一个有序序列的合适位置。插入的位置是采用折半查找法确定的。

    C语言下的冒泡排序,可以直接编译使用

    这个C语言程序主要实现了一个简单的冒泡排序算法。程序首先引入头文件以使用输入和输出函数。 在程序中定义了一个名为swap的函数,该函数用于交换两个整数的值。在bubble_sort函数中实现冒泡排序算法。这个函数接收...

    实现 数据结构 和简单算法&lt;Play Data Structures in Java&gt;

    排序算法(如冒泡排序、快速排序、归并排序),查找算法(如顺序查找、二分查找、哈希查找),图论算法(如Dijkstra最短路径算法、Floyd-Warshall算法、Prim最小生成树算法),动态规划,贪心算法,回溯法,分支限界...

Global site tag (gtag.js) - Google Analytics