数据结构:插入排序(直接插入、希尔排序)

       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]);
	}
}

猜你喜欢

转载自blog.csdn.net/wh_0727/article/details/83794929