经典算法之插入排序(直接插入排序、shell排序)
来源:互联网 发布:老版本mac如何升级系统 编辑:程序博客网 时间:2024/06/14 18:29
注:文章来源实验楼
一、直接插入排序
首先我们来讲直接插入排序,它的做法是:每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从前向后扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(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");}
二、希尔排序(shell排序)(二分法+直接插入法)
希尔排序也是插入排序的一种,但它在效率上要比上面的直接插入排序高,它是对直接插入排序的改进,它的基本思想是先取一个小于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。
阅读全文
0 0
- 经典算法之插入排序(直接插入排序、shell排序)
- 经典排序算法之直接插入排序
- 算法-插入排序之直接插入排序
- 排序算法-插入排序之直接插入
- 排序算法--插入排序(直接插入排序、折半插入、shell排序)的java实现
- java实现排序算法之插入排序(直接插入排序,折半插入排序,希尔排序)
- 排序:插入排序(直接插入排序、Shell排序)
- 算法---插入排序(直接插入排序)
- 算法实现之直接插入排序与shell排序
- 经典算法之直接插入排序(三种实现)
- 插入排序之直接插入排序和Shell排序
- java算法之二直接插入排序(插入排序)
- 排序算法之直接插入排序算法
- 算法之直接插入排序
- 排序算法之直接插入
- 【算法】之直接插入排序
- 算法学习之排序算法:插入排序(直接插入排序、折半插入排序、2-路插入排序)
- [排序算法,插入排序]--直接插入排序
- bzoj4176 Lucas 的数论
- GIT——基本操作
- oracle 中 Flashback table功能恢复某个表数据!!
- hdoj1045 Fire Net(dfs)
- 解决PHP报错ZipArchive library is not enabled异常的方法
- 经典算法之插入排序(直接插入排序、shell排序)
- LeetCode 131. Palindrome Partitioning
- js删除数组中的元素
- [四]Spring Boot 整合Mybatis
- 运行mongodb创建data库时出现计算机丢失api-ms-win-crt-runtime-|1-1-0.dll
- MyEclipse自动生成访问器
- 2.搭建开发环境所需的工具
- Delphi程序引用C#:报缺DCU文件。。。
- hashcode和equals重写规则