- C++ 开发 Web 服务框架
- 1 小时入门增强现实技术
- C++ 实现高性能内存池
- GDB 简明教程
- C++ 实现太阳系行星系统
- C++11/14 高速上手教程
- C 语言实现 Linux Shell 命令解释器
- C++ 打造 Markdown 解析器
- C 语言实现文件类型统计程序
- C 语言实现 Linux touch 命令
- C 语言入门教程
- C 语言实现多线程排序
- 多线程生产者消费者模型仿真停车场
- C++实现运动目标的追踪
- C 语言实现 Linux 网络嗅探器
- 100 行 C++ 代码实现线程池
- C 语言实现聊天室软件
- C 语言实现 Linux who 命令
- C 语言实现 Linux cp 命令
- C++实现第一人称射击游戏
- C++ 实现银行排队服务模拟
- 数据结构(新版)
- 软件工程(C 编码实践篇)
- C 语言制作简单计算器
- C 语言版 flappy_bird
- C 语言编写万年历
- C 语言版扫雷游戏
- C 语言实现一个支持 PHP 的简易 WEB 服务器
- C 语言制作 2048
- C 语言模拟 ATM 自动取款机系统
- Linux 系统编程
- C 语言利用 epoll 实现高并发聊天室
- C 语言快速实现五子棋
- C 语言实现 ping 程序
- 简单词法分析器(C++语言)
第 7 节 插入排序
实验简介
学习了前面一章的查找,我们知道二分查找需要先对数据进行排序,那么这章开始我们就来讲解一下几种经典的排序算法。
一、直接插入排序
首先我们来讲直接插入排序,它的做法是:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1) 趟扫描以后就完成了整个排序过程,如下图所示。
直接插入排序的代码实现:
#include <stdio.h>
#include <stdlib.h>
int n;
/*
* 直接插入排序
*/
void InsertSort(int *array)
{
int i, j;
for (i = 2; i <= n; i++)
{
if (array[i] < array[i - 1])
{
array[0] = array[i];
array[i] = array[i - 1];
for (j = i - 2; array[0] < array[j]; j--)
{
array[j + 1] = array[j];
}
array[j + 1] = array[0];
}
}
}
int main()
{
int i;
int *array;
printf("请输入数组的大小:");
scanf("%d", &n);
array = (int*) malloc(sizeof(int) * (n + 1));
printf("请输入数据(用空格分隔):");
for (i = 1; i <= n; i++)
{
scanf("%d", &array[i]);
}
InsertSort(array);
printf("排序后为:");
for (i = 1; i <= n; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
二、希尔排序
希尔排序也是插入排序的一种,但它在效率上要比上面的直接插入排序高,它是对直接插入排序的改进,它的基本思想是先取一个小于 n 的整数 d1 作为第一个增量,把文件的全部记录分组。所有距离为 d1 的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量 d2< d1 重复上述的分组和排序,直至所取的增量 dt=1(dt<…< d2< d1),即所有记录放在同一组中进行直接插入排序为止,增量序列尤为关键,一般的初次取序列的一半为增量,以后每次减半,直到增量为 1,大致过程如下图所示。
希尔排序的代码实现:
#include <stdio.h>
#include <stdlib.h>
int n;
/*
* 希尔排序
*/
void ShellSort(int *array)
{
int k = n / 2; //增量序列(仅作举例)
while (k > 0)
{
int i, j;
for (i = k + 1; i <=n; i++)
{
if (array[i] < array[i - k])
{
array[0] = array[i];
for (j = i - k; j > 0 && array[0] < array[j]; j -= k)
{
array[j + k] = array[j];
}
array[j + k] = array[0];
}
}
k = k / 2;
}
}
int main()
{
int i;
int *array;
printf("请输入数组的大小:");
scanf("%d", &n);
array = (int*) malloc(sizeof(int) * (n + 1));
printf("请输入数据(用空格分隔):");
for (i = 1; i <= n; i++)
{
scanf("%d", &array[i]);
}
ShellSort(array);
printf("排序后为:");
for (i = 1; i <= n; i++)
{
printf("%d ", array[i]);
}
printf("\n");
}
三、小结
这一章讲了插入排序中的两个经典算法,直接插入排序和希尔排序。直接插入排序的主要思想是每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序,它属于稳定的排序,最坏时间复杂性为 O(n^2),空间复杂度为 O(1)。希尔排序的主要思想是分组插入,它是不稳定的排序,它的时间复杂度跟增量序列有关,在取增量序列时要保证其中的值没有除 1 之外的公因子,并且最后一个增量值必为 1。
作业
结合这章讲的插入排序实现二分查找。
实验中有任何问题欢迎到 实验楼问答 提问。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论