直接插入排序

  • Post author:
  • Post category:其他




直接插入排序



算法思想

从当前位置开始,从后往前找比当前数字小的数字,找到后插入到这个小的数字后面;

在找的过程中,如果发现一个比当前数字大的数字,则两个数字同时往后挪。



算法思想举例

数组:9 8 7 6 5

首先从第二位数字“8”开始,从“8”往前找比“8”小的数字,因为只有“9”,“9”大于“8”,则“9”挪到“8”位置,“9”前面没数字了,则把“8”放在第一位。

如果数组为:7 8 9 5 6

则数字“8”前面只有“7”,比“8”小,则把“8”插在“7”后面。

如果数组为:1 2 3 4 6 7 8 5

当前数字为“5”,从“5”往前找,“8”大于“5”,“8”放在“5”的位置,“7”大于“5”,“7”放在“8”的位置,“6”大于“5”,“6”放在“7”的位置,“4”小于“5”,“5”放在“4”后面的位置。



代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>

void InsertSort(int* arr, int len)
{
	for (int i = 1; i < len; ++i)
	{
		int tmp = arr[i];
		int j = i - 1;
		while (j >= 0 && arr[j] > tmp)
		{
			j--;
		}
		int k = i;
		for (; k > j + 1; --k)
		{
			arr[k] = arr[k - 1];
		}
		arr[k] = tmp;
	}
}

void Show(int* arr, int len)
{
	for (int i = 0; i < len; ++i)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

int main()
{
	int str[] = { 8,5,3,6,7,9 };
	int n = sizeof(str) / sizeof(str[0]);
	InsertSort(str, n);
	Show(str, n);

	int arr[] = { 5,3,9,7,11,11,1 };
	int m = sizeof(arr) / sizeof(arr[0]);
	InsertSort(arr, m);
	Show(arr, m);
	return 0;
}



效率分析

时间复杂度:O(n^2)(完全有序为O(n))

空间复杂度:O(1)

稳定性:稳定(没有跳跃式的交换)



版权声明:本文为FKDXM原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。