欢迎光临
我们一直在努力

考研 数据结构(考研数据结构参考)

考研 数据结构,考研数据结构真题


苏世计算机考研,程序猿专属的学习分享社区


/ 写在前面的话 /

初试攻略,考研初试方法论都在这里。


相信很多同学在复习数据结构这一门课的时候,排序算法这一块总是让自己头都大了,今天小苏特地为大家整理了数据结构考研中常出现的8种排序算法的标准代码,包括C语言和Java


如果还有其他小伙伴习惯其他的编程语言,欢迎留言告诉小苏哦,小苏也可以为大家整理出其他编程语言的版本。


话不多说,先上我们整理好的了笔记(以下讨论都是基于升序排序的)。


首先看这8种排序算法的时间复杂度

从平均情况看:堆排序、归并排序、快速排序胜过希尔排序。

从最好情况看:冒泡排序和直接插入排序更胜一筹。

从最差情况看:堆排序和归并排序强过快速排序。


一、选择排序

选择排序算法通过从未排序部分重复查找最小元素并将其放在开头来对数组进行排序。该算法在给定初始数组中主要对两个子数组进行操作。(1)已排序的子数组;(2)未排序的剩余子数组。


选择排序算法(C语言版)

选择排序算法(Java版)


二、插入排序

(1)从arr [1]迭代到arr [n];

(2)将当前元素与其前一个元素进行比较;

(3)如果关键元素小于其前一个元素,那就拿这个关键元素再与更前一个元素进行比较。将较大的元素上移一个位置,为交换的元素留出空间(如图所示);

(4)n个元素需要进行n-1趟排序。



插入排序算法(C语言版)


插入排序算法(Java版)


三、冒泡排序

冒泡排序的思路是随便从某一方向开始,然后依次对相邻两个元素比较,把小的放左边,大的放右边。

如果是从右往左的方向,那么最后在最左边的元素为最小值。如果是从左往右的方向,那么最后在最右边的元素为最大值。冒泡排序为什么叫冒泡,可能就是因为这个思想就像水里鱼儿吐泡泡一样,从低到高一直升上去吧。


冒泡排序算法(C语言版)

冒泡排序算法(Java版)


四、希尔排序

可以认为希尔排序是插入排序的一种变体。在插入排序中,我们仅将元素向前移动一个位置。当一个元素必须向前移动时,就会涉及到许多移动。希尔排序的想法是允许交换远项。在希尔排序中,我们对数组按下标的一定增量分组,然后对每个子数组进行插入排序,直到当增量值减小到1,整个数组分为一个组了,于是算法便终止。


希尔排序算法(C语言版)

希尔排序算法(Java版)


五、快速排序

和归并排序一样,快速排序是分而治之的算法。它选择一个元素作为中轴基准,并围绕选定的中轴基准对给定的数组进行分隔。

快速排序有许多不同的版本,它们以不同的方式选择中轴基准,比如:始终选择第一个元素作为枢轴、始终选择最后一个元素作为枢轴、选择一个随机元素作为枢轴、选择中位数作为枢轴等。


快速排序算法(C语言版)


快速排序算法(Java版)


六、堆排序

为什么要使用基于数组的二进制堆形式?

由于二进制堆是完全二进制树,因此可以很容易地将其表示为数组,并且基于数组的表示节省空间。如果父节点存储在索引L处,则左子节点可以通过2 * L+ 1计算,右子节点可以通过2 *L + 2计算(假定索引从0开始)。


堆排序算法(C语言版)

堆排序算法(Java版)


七、归并排序算法

像快速排序一样,归并排序是一种分而治之的算法。它将输入数组分为两个半部分,每次归并排序分别对左右两边进行归并排序,直至细分到两两分组。


它的中心函数思想流程如下:

mergeSort(arr [],l,r)

如果r> l

1.找到中间点,将数组分为两半:

中间m = l +(r-l)/ 2

2.调用上半部的mergeSort:

调用mergeSort(arr,l,m)

3.调用mergeSort作为下半部分:

调用mergeSort(arr,m + l,r)

4.合并在步骤2和3中分类的两个部分:

调用merge(arr,l,m,r)


归并排序算法(C语言版)


归并排序算法(Java版)


八、基数排序

基于比较的排序算法(归并排序,堆排序,快速排序等)的最好情况下复杂度是O(nLogn),也就是说,他们没办法做的比O(nLogn)更好了。基数排序是一种线性时间排序算法,当元素的范围从1到k时,它以O(kn)时间进行排序


基数排序(C语言版)


基数排序(Java版)


苏世学社旗下品牌,专注于计算机考研

计算机考研一手资讯,原创高质量干货

深度的学习分享丨咨询前辈丨个性化指导

考研 数据结构(考研数据结构参考)

未经允许不得转载:考研 数据结构(考研数据结构参考)

分享到:更多

留言与评论(共有 0 条评论)
   
验证码:

考研百科,考研究生全知道

联系方式 关于我们