数据结构-插入排序

一.概要

插入排序是一种基于比较的排序算法,其基本思想是将待排序的元素插入到已排序的序列中,形成新的有序序列。

插入排序算法的过程如下:

  1. 将待排序序列分为两部分:已排序部分和未排序部分;

  2. 初始时,已排序部分只有一个元素,即第一个元素,未排序部分包含剩下的所有元素;

  3. 对于未排序部分中的每个元素,从后向前扫描已排序部分,找到其在已排序部分中的位置;

  4. 将该元素插入到已排序部分中的相应位置,使得插入后仍然保持有序。

        在实现过程中,我们可以使用循环来遍历未排序部分中的每个元素,并将其插入到已排序部分中。具体实现方法是,从当前位置向前遍历已排序部分,找到第一个比当前元素小的位置,然后将当前元素插入到这个位置之后。插入排序算法的时间复杂度为 O(n2)O(n2),其中 nn 是待排序序列的长度。

         相比冒泡排序和选择排序,插入排序虽然执行次数也是 O(n2)O(n2),但是其内部循环的比较操作更少,因此效率更高。尤其对于基本有序或者小规模的序列,插入排序的性能表现更为优秀。

void InsertSort(int* a, int n) {
	for (int i = 1; i < n; i++)
	{
		int end=i-1;
		int tmp=a[i];
		//将tmp插入[0,end]区间
		while (end>=0)
		{
			if (tmp < a[end])
			{
				a[end + 1] =a[end];
				--end;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

该函数接受两个参数:一个整型数组 a 和数组的长度 n。该函数的实现过程如下:

  1. for 循环从第二个元素开始遍历整个数组,每次从数组中取出一个元素并保存在变量 tmp 中;

  2. 变量 end 记录已排序部分的最后一个元素的下标,初始值为当前元素的前一个下标;

  3. 使用 while 循环从已排序部分的最后一个元素向前遍历,将所有比当前元素大的元素向右移动一位(即将元素 a[end] 移动到 a[end + 1] 的位置),直到找到第一个比当前元素小的元素的下标,将变量 end 更新为该下标;

  4. 将变量 tmp 插入到合适的位置上(即将 tmp 赋值给位于下标 end+1 的元素)

测试文件

void test1() {
	int a[] = {1,8,9,10,11,12,18,16,19,20};
	int n = sizeof(a) / sizeof(a[0]);
	PrintSort(a, n);
	InsertSort(a,n);
	PrintSort(a,n);
}

int main() {
	test1();
	return 0;
}

小蒋同学的CSDN: 用于CSDN文章中的代码分享 - Gitee.comhttps://gitee.com/jiang-yanxi123/xiaojiangs---csdn/tree/master/test0408

你可能感兴趣的:(数据结构,排序算法,算法)