一类:插入排序
插入排序法:
一.基本思想:输入一个元素,检查数组列表中的每个元素,将其插入到一个已经排好序的数列中的适当位置,使数列依然有序,当最后一个元素放入合适位置时,该数组排序完毕。
二.实例分析:
三.稳定性分析:稳定性:插入排序是在一个已经有序的小序列的基础上,一次插入一个元素。当然,刚开始这个有序的小序列只有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≤K2iKi≤K2i+1(1≤I≤[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)是分治法思想运用的一个典范。1将n个元素分成两个含n/2元素的子序列;2用MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列);3合并两个已排序好的序列。
二.实例分析:
三.稳定性分析:稳定性:归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素(认为直接有序)或者2个序列(1次比较和交换),然后把各个有序的段序列合并成一个有序的长序列,不断合并直到原序列全部排好序。可以发现,在1个或2个元素时,1个元素不会交换,2个元素如果大小相等也没有人故意交换,这不会破坏稳定性。那么,在短的有序序列合并的过程中,稳定是是否受到破坏?没有,合并过程中我们可以保证如果两个当前元素相等时,我们把处在前面的序列的元素保存在结果序列的前面,这样就保证了稳定性。所以,归并排序也是稳定的排序算法。
五类:基数排序
一.基本思想:根据数字的性质来逐个根据个位数、十位数、百位数分类求得进行分类。
二.实例分析:
三.稳定性分析:稳定性:基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序,最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以其是稳定的排序算法。
总结:以上是软考中常见的几种排序,其实还有一些排序没有写上,作为研究这几种排序最重要知道这种排序中运用的思想是什么,通过思想理解实例,那么理解排序就能事倍功半,其中排序的时间复杂度和空间复杂度自己没有写,因为这一部分自己也是靠记忆来知道的,具体想知道要从程序的角度来分析,感觉自己现在对着复杂度理解还有一段的距离,望谅解。
分享到:
相关推荐
在计算机科学中,排序算法是数据结构领域的重要组成部分,它涉及到如何有效地重新排列一组数据,使其按照特定的顺序(如...在实际应用中,通常会使用更高效的排序算法,如归并排序或快速排序,特别是在处理大量数据时。
本话题主要探讨六种内部排序算法:直接插入排序、希尔排序、冒泡排序、快速排序、选择排序以及堆排序。这六种排序算法各有优劣,适用于不同的场景,接下来我们将逐一进行详细阐述。 1. **直接插入排序**: 直接...
快速排序法的时间复杂度为O(n log n),是目前最快的排序算法之一。 3. 直接插入排序法 直接插入排序法是一种简单的排序算法,通过不断地比较和插入元素来排序数组。其实现步骤如下: * 从数组的第二个元素开始,...
2. 冒泡排序:是最简单的排序算法之一,通过不断交换相邻位置的元素来逐渐达到排序的目的。每一轮遍历都能确保最大(或最小)的元素被放置到正确的位置,重复这个过程直到整个数组排序完成。 3. 选择排序:每次从未...
然而,值得注意的是,对于小规模数据,两种排序算法的性能差异可能并不明显,此时算法的简单性和易理解性可能比效率更重要。 总的来说,快速排序和冒泡排序都是排序算法的重要实例,它们代表了不同的时间复杂度级别...
直接排序法、折半插入法、希尔排序法和快速排序法是计算机科学中常见的排序算法,它们在数据处理和算法理解上都具有重要的地位。这些排序算法的C语言实现为初学者提供了很好的学习材料,特别是在VC++6.0环境下进行...
尽管简单选择排序的时间复杂度总是O(n^2),但由于它只需要进行n-1次交换,对于小规模数据或部分有序的数据,它可能比冒泡排序更快。 以上四种排序算法都是基础的排序方法,适用于小规模数据或教学场景。然而,在...
本文将深入探讨Java编程语言中实现的七种主要排序算法:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序以及归并排序。每种算法都有其独特性,适用于不同的场景和数据特性。 1. **直接插入排序**:...
直接插入排序是一种简单的排序算法,它的工作原理类似于我们手动排序扑克牌。算法首先将数组视为已排序部分和未排序部分,然后将未排序部分中的元素逐个与已排序部分的元素比较,找到合适的位置插入。这种算法在...
这些算法虽然在复杂度上不如高级排序算法如快速排序或归并排序,但它们提供了基础的排序逻辑,有助于理解更复杂的算法思想。 首先,我们来详细讲解插入排序(Insertion Sort)。插入排序的工作原理类似于我们手动...
希尔排序的时间复杂度取决于增量序列,但通常比简单插入排序更快。 5. **堆排序**: 堆排序利用了二叉堆的数据结构,将待排序序列构造成一个大顶堆或小顶堆,然后不断将堆顶元素与末尾元素交换,调整堆,直到整个...
对于程序员来说,理解这些基础的排序算法不仅仅是应付面试的需要,更是进行复杂数据处理、性能优化和软件开发中的必备技能。通过这些算法的学习和应用,可以加深对算法思想的理解,提高解决实际问题的能力。
其时间复杂度取决于增量序列的选择,但通常比简单的插入排序更快。 5. **归并排序**:归并排序采用分治策略,将序列分为两半分别排序,再合并两个已排序的子序列。归并排序在所有情况下的时间复杂度都为O(n log n)...
插入排序是一种简单的排序算法,它的基本思想是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。在C++中,可以使用两层循环实现,外层循环控制未排序部分,内层循环寻找插入...
它通过将待排序的元素按照一定的增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。希尔排序的时间复杂度通常在O(n^(3/2)...
例如,对于小规模数据,简单排序算法可能是最优选择;对于大规模且无特殊要求的数据,快速排序或堆排序可能是更好的选择;对于整数排序,基数排序和计数排序则非常有效。 在C/C++中实现这些排序算法,不仅可以帮助...
在编程领域,排序算法是数据结构与算法学习中的核心部分,尤其在C++这样的强类型语言中,理解和熟练掌握各种排序算法对提升编程能力至关重要。本文将深入探讨五种常用的排序算法:快速排序、归并排序、选择排序、...
在本主题中,我们将探讨如何使用C++类来实现不同的排序算法,并理解类在实现这些算法时的角色。我们将重点关注以下几个方面: 1. **类的概念与作用**:在C++中,类是一种用户自定义的数据类型,它允许我们封装数据...
希尔排序的时间复杂度在最坏情况下为O(n^2),但在实际应用中,由于其优秀的平均性能,通常比简单的插入排序更快。 2. **快速排序**: 快速排序是由C.A.R. Hoare提出的,采用分治策略。选取一个基准元素,将数组...