发布时间:2025-06-24 20:41:14 作者:北方职教升学中心 阅读量:241
1.2.运用
购物筛选排序
院校排序
1.3.常见排序算法
通过上面的应用可以看出我们的生活和排序息息相关,下面小编讲述下排序算法,可能看到这篇文章的有很多学完了C语言的同学们,在大多数的学校的C语言课程讲解中,大概率都会讲到一个算法:冒泡排序,这个算法算是大多数人都熟悉的算法了,小编也曾写过冒泡排序算法的文章,感兴趣的读者朋友可以去看一看那边的冒泡解法,下面小编展示一下常见的排序算法有什么。它的基本思想是:先选定一个整数gap3(通常是gap = n / 3 + 1),把待排序文件所有的记录分成组,把所有距离相等的记录在同一组内,并对组内的数据进行排序,然后继续让gap = gap / 3 + 1(至于为何加1,我等会再说)得到下一个数,之后重复上面的步骤,把数组继续分组,进行插入排序,当gap == 1的时候,就相当于直接插入排序了。
之后我们继续往后进行排序,最后会预排序成一个新的数组,在预排序的基础上继续进行预排序,最后仍然会实现出一个排序好后的数组,这里小编省略了很多的步骤,我感觉希尔排序和直接插入排序实在是太像了,所以我就不细讲了,粗略说说,直接进入代码讲解部分。
2.2.2.理论部分
对于希尔排序,我在前面的简介就说到了,它其实就是把一个完整的数组,分为一个一个小小的模块进行排序,之后通过不断的分组,分到gap等于1了,然后在进行一次直接插入排序,这样我们就把数组排序好了,所以小编认为,希尔排序,无非就是分为一下两步走:
上面两步就足矣概括希尔排序的步骤了,下面小编叨叨为什么我们要每次3个分为一组,因为如果分组过大,这样的话还不如不分,分组过小的话,就显得很啰嗦,所以每一次除以3,算是一个比较中和的分组,下面我来正式说一说希尔排序的实现流程,通过图文进行讲述。
2.2.希尔排序
2.2.1.简介
希尔排序又称为缩小增量法。
2.1.直接插入排序
2.1.1.理论讲解
直接插入排序就是插入排序的一种,我们想要实现它,需要用到两个“指针”来进行实现,注意:这里的指针并不是真正的指针,这里的指针可以是数,可以是一个指针的指针,其中一个记录当前位置的数据,这里小编叫做end,另一个记录下一个位置的数据,这里小编叫做tmp,这里我们就拿升序举例子,我们拿end和tmp的值进行比较,如果此时的end比tmp大,那么让end + 1位置的数据等于end的数据,然后让end–,直到end变为0或者end的值小于tmp的值,让end -+1的数据变为tmp,这里其实我们就实现了一个简易的范围排序,考虑到光用文字讲述可能读者朋友听不懂,于是我决定通过图片+ 文字的方式帮助大家去掌握直接插入排序。 { arr[end + 1] = arr[end]; end--; } else { break; } } arr[end + 1] = tmp; }}
2.1.3.时间复杂度分析
杜宇时间复杂度来说,此时我们就分析它最差的时间复杂度,当我们接手的是一个完全降序的数组,此时我们要记性排序的话,可是要把内层的循环完全走完,这里我就不在过多计算了,其实就是计算一个等差数列的前n项和,忘记这部分的读者朋友,我直接帮大家寻找计算方法:
S n = n ( a 1 + a n ) / 2 Sn = n(a1 + an) / 2 Sn=n(a1+an)/2
之后在我们的计算以后,不难得出它的时间复杂度是O(N^2),这个时间复杂度是很伤的,太大了,大到和冒泡排序一样了,小编在上面也说了,只有数组是完全的降序的时候,此时我们想排升序数组的时间复杂度会超级大,那么这个代码能否可以进行优化呢?答案是可以的,优化完后的排序,就是我们今天要讲述的——希尔排序,下面,小编带领各位揭开希尔排序神秘的面纱。
3.代码汇总
鉴于部分读者朋友只想知道插入排序的代码是什么,于是我通过这部分来展示本文所展现的两种排序的代码:
1.直接插入排序
void InsertSort(int* arr, int n){ for (int i = 0; i < n - 1; i++) { int end = i; int tmp = arr[end + 1]; while (end >= 0) { if (arr[end] > tmp) { arr[end + 1] = arr[end]; end--; } else { break; } } arr[end + 1] = tmp; }}
2.希尔排序
void ShellSort(int* arr, int n){ int gdp = n; while (gdp > 1) { gdp = gdp / 3 + 1; //为了避免n == 6这种情况,会陷入死循环 for (int i = 0; i < n - gdp; i++) { int end = i; int tmp = arr[end + gdp]; while (end >= 0) { if (arr[end] > tmp) { arr[end + gdp] = arr[end]; end = end - gdp; } else { break; } } arr[end + gdp] = tmp; } }}
4.总结
此时本文就已经完全结束了,今天小编带领各位探索了关于插入排序的秘密,其实我博客起这个名字和我高中看过的一本数学教材有关,它叫做《导数的秘密》,通过那个文章给了我题目的灵感,本文讲述的插入排序各位一定要好好掌握,它对于我们以后排序的学习有教育意义,大家最好看完我的理论部分后自己上手敲一敲,这样有助于知识的提升,如果文章有错误,可以在评论区指出,我会定期来看评论区回复各位的问题,那么大佬们,我们下一期见啦!