【排序算法】----详解直接插入排序算法

1.直接插入排序算法。

单趟排序:
我们以升序为例子,简单来说就是将大数放到靠右边的位置,我们将第一个数作为当前数arr[end],将下一个数储存起来tmp=arr[end+1],然后比较下一个数和当前数的大小arr[end]?tmp,如果比当前数小,那么我们将当前数赋值给下一个数arr[end+1]=arr[end]。依次移动赋值,直到比end前面的某个数大时,停止,然然后将储存起来的数赋值给原来的位置arr[end+1]=tmp,然后对整个数组进行遍历,单趟排序就可以完成排序。

我个人的理解就是把大的值放在最后边,然后比较后面的值和当前的值大小,大的就放到最后边,小的话,就继续向前找,找到合适的位置,不管用赋值还是交换,只要达到效果就行。
在这里插入图片描述

2.代码展示

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

void Swap(int *p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

void Sort(int* arr, int n)
{				
	int num = arr[0];
	int index = 0;
	int i = 0;
	while (i<=n) 
	{
		if (num <= arr[i])
		{
			num = arr[i];
			index = i;
			++i;
		}
		else
		{
			
			while (index >= 0 && arr[index + 1] < arr[index])
			{
				Swap(&arr[index], &arr[index + 1]);
				--index;
			}
			index = i;
			++i;
			num = arr[index];
		}
	}
}
void Print(int* arr, int n)
{
	for (int i = 0; i <= n; i++)
	{
		printf("%d ",arr[i]);
	}
	printf("\n");
}

int main()
{
	int arr[] = { 1,5,6,7,8,9,64,2,5,6,5,1,3,13,13,1,5,5,15};
	int n = sizeof(arr) / sizeof(arr[0]);
	Sort(arr, n - 1);
	Print(arr, n - 1);
	system("pause");
	return 0;
}

3.结果展示

在这里插入图片描述

4.时间复杂度空间复杂度

最好情况:正是我们需要的顺序,循环N次 时间时间复杂度为O(n).
最坏情况:与需要的顺序相反,需要循环n…1的等差数列次,时间复杂度为O(n2).
空间复杂度为O(1),没有开辟新的空间。

5.心得体会

写这种题,最好先找到单趟排序的算法。单趟算法出来了,循环就出现多趟解法,所以一定要学会拆分问题。

发布了79 篇原创文章 · 获赞 6 · 访问量 3774

猜你喜欢

转载自blog.csdn.net/qq_41152046/article/details/105122984
今日推荐