计算机考研时几种常见内部排序算法总结(C语言篇)
本文是根据 数据结构(C语言版 严蔚敏)课本上第十章出现的内部排序算法,进行总结,自我分析,适合考研的兄弟姐妹们食用(我也是个考研狗),如有错误,欢迎留言指出,多谢支持!
一.首先我们来看看这些常见的内部排序算法的比较
排序算法 | 最好时间复杂度 | 平均时间复杂度 | 最差时间复杂度 | 空间复杂度 | 数据对象稳定性 |
---|---|---|---|---|---|
冒泡排序(Bubble Sort)(掌握) | O(n) | O(n²) | O(n²) | O(1) | 稳定 |
选择排序(Selection sort)(掌握) | O(n²) | O(n²) | O(n²) | O(1) | 数组不稳定、链表稳定 |
插入排序(Insertion Sort)(掌握) | O(n) | O(n²) | O(n²) | O(1) | 稳定 |
快速排序(Quick Sort)(掌握) | O(n*log₂n) | O(n*log₂n) | O(n²) | O(log₂n) | 不稳定 |
堆排序(Heap Sort)(掌握) | O(n*log₂n) | O(n*log₂n) | O(n*log₂n) | O(1) | 不稳定 |
归并排序(Merge Sort)(掌握) | O(n*log₂n) | O(n*log₂n) | O(n*log₂n) | O(n) | 稳定 |
希尔排序(Shell Sort)(掌握) | O(n) | O(n*log₂n) | O(n²) | O(1) | 不稳定 |
基数排序(Radix Sort)(理解) | O(d(n+rd)) | O(d(n+rd)) | O(d(n+rd)) | O(rd) | 稳定 |
其他的数列排序还有:桶排序、计数排序、块排序、平滑排序…等,这些不在考研课本的范围内,之后有机会会慢慢补充。
注:以下代码都会用到随机数来生成随机数组
#include<time.h>//需要的头文件
srand((unsigned int)time);//生成随机数代码
int arr[10];//十个数组
for (int i = 0; i < 10; i++)
{
arr[i] = rand() % 100;//生成随机数范围0-100
printf("%d ",arr[i]);//打印这十个数
}
还有打印指令
for (int i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
二.分类讨论与代码展示
1.冒泡排序(Bubble Sort)
冒泡排序(又可以叫起泡排序)算是排序算法里的基础,属于稳定的排序算法 ,冒泡的本质是交换两个数进行比较 然后交换,多次循环,完成排序。想必大家都接触过,这里,我用一个公式简单表明
for (int i = 0; i < len - 1; i++)//len代表数组长度,(可替换)(i代表的是数组下标)
{
for (int j = 0; j < len - 1 - i; j++)
{
if (arr[j]>arr[j + 1])//两个数大小比较
{
int temp = arr[j];//赋值
arr[j] = arr[j + 1];//交换
arr[j + 1] = temp;
}
}
}
2.选择排序(Selection sort)
选择排序是一个不稳定的排序,选择排序的基本就是在于先搜索找到最小(大)的一个值,进行左移到第一位,然后重复这个动作直到所有的都排序完成
for (int i = 0; i < len-1; i++)//len代表数组长度,(可替换)(i代表的是数组下标)
{
int min = i;//假设i号位是一个最小值
for (int j = i+1; j < len; j++)继续搜索
{
if (arr[j] < arr[min])//进行搜索如果新找到数j比i小
{
min = j;