【数据结构】八大排序之直接插入排序

一.直接插入排序

      直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表 

1.直接插入排序的基本思想:

以数组int arr[] = { 3, 1, 4, 6, 5, 9, 2, 7, 8 };   为例:

1.)我们以第一个数据3为有序数列

2.)从第二个开始,将每次拿到的数先保存起来,然后循环和有序数列中的数作比较,最后将拿到的数插入它的有序位置

2.大白话理解

很多排序方法,都可以用我们小时候上学排队的方式来解释。插入排序,想一下以前在上课的时候,老师在给我们排队时,有没有这样的举动,让你和在你前面的同学,比身高,如果你比前面的同学矮的话,前面的同学就站到你的位置,然后你在和你现在前面的同学进行身高比较,如果你还是比较矮的话,前面的同学则换到你的位置。直到你比前面同学高为止,将你插入前面同学后面。

  假设老师从第二个同学开始调整位置,然后一直调整到最后一位,那么这种排序的方法就叫做插入排序。

我们可以从下方的动图中很容易看到直接插入排序的思想:

代码展示:

void InsertSort(int* arr, int sz)
{
	for (int i = 1; i < sz; ++i)
	{
		int j = i - 1;
		//将拿到的数保存
		int temp = arr[i];
		int count = 0;
		//循环比较
		while (j>=0 && arr[j] > temp)
		{
			//搬移元素
			if (arr[j] > temp)
			{
				arr[j+1] = arr[j];
				++count;
			}
			--j;
		}
		if (count > 0)
		{
			//最后将拿到的数据插入有序的位置
			arr[j+1] = temp;
		}
}

二.总结

     我们可以看出直接插入排序,在每次插入元素时,只是找比他大的元素,然后去搬移数据。这样在排序成功后不会影响数组内每个数的相对位置。所以直接插入排序是稳定的排序

    时间复杂度:O(n*n)

   空间复杂度:O(1)

猜你喜欢

转载自blog.csdn.net/alidada_blog/article/details/82888446