1.直接插入排序 :是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。
基本思想:直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
2.希尔排序:是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。
基本思想:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
附:各种排序时空复杂度对比
直接插入排序实现:
#include<stdio.h>
#include<stdlib.h>
void InsertSort(int arr[], int len)
{
int tmp = 0;
int i = 1;
int j = i - 1;
for (i; i < len; ++i)
{
tmp = arr[i];
for (j = i - 1; j >= 0 && arr[j] > tmp; --j)
{
arr[j + 1] = arr[j];
}
arr[j + 1] = tmp;
}
}
希尔排序实现:
#include<stdio.h>
#include<stdlib.h>
void Shell(int arr[], int len, int dk)
{
int tmp = 0;
int i = dk;
int j = i - dk;
for (i; i < len; ++i)
{
tmp = arr[i];
for (j = i - dk; j >= 0 && arr[j] > tmp; j -= dk)
{
arr[j + dk] = arr[j];
}
arr[j + dk] = tmp;
}
}
void ShellSort(int arr[], int len, int dk[], int dlen)
{
for (int i = 0; i < dlen; ++i)
{
Shell(arr, len, dk[i]);
}
}