0
点赞
收藏
分享

微信扫一扫

赋能 DevOps:平台工程的关键作用

蓝哆啦呀 03-25 08:02 阅读 7

1.直接插入排序

当插入第 i 个元素时,前面的数据已经排好序了,将后续的数据按大小插入到前面已经排好序的数组中,就是插入排序

特点

1.元素集合越接近有序,时间效率越高

2.时间复杂度O(N^2)

3.空间复杂度O(1)

//插入排序
void InsertSort(int* a, int length)
{
	for (int i = 0; i < length - 1; i++)
	{
		int end = i;//已经排好的数组的尾部
		int temp = a[end + 1];
		while (end >= 0)
		{
			if (temp < a[end])//小就向前移
			{
				a[end + 1] = a[end];
				--end;
			}
			else
			{

				break;
			}
		}
		a[end + 1] = temp;
	}
}

2.希尔排序

时间复杂度约为O(N ^ 1.3)

先进行预排序 -- 目标 : 接近有序

然后再进行插入排序 -- 目标 : 有序

预排序

设定间距(两个数的下标之差)为gap,将彼此间距为gap的数进行插入排序

gap越大,数据跳的越快,大的数据更快到前面的位置,但是越不有序

gap越小,越接近有序

gap = 1时,就是插入排序

eg.

进行希尔排序时可以进行多次预排序,每次gap / 2,并且要求gap > 1保证最后一次预排序gap = 1,即完成排序

void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap /= 2;//进行多次预排序,gap > 1保证最后一次预排序gap = 1,即完成排序
		for (int j = 0; j < gap; ++j)
		{
			for (int i = j; i < n - gap; i += gap)
			{
				int end = i;//已经排好的数组的尾部
				int temp = a[end + gap];
				while (end >= 0)
				{
					if (temp < a[end])//小就向前移
					{
						a[end + gap] = a[end];
						end -= gap;
					}
					else
					{
						break;
					}
				}
				a[end + gap] = temp;
			}
		}
	}
}

gap也可以取3,但是为了保证最后一次预排序时gap为1,还需要gap + 1

void ShellSort(int* a, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap /= 3 + 1;//进行多次预排序,gap > 1保证最后一次预排序gap = 1,即完成排序
		for (int j = 0; j < gap; ++j)
		{
			for (int i = j; i < n - gap; i += gap)
			{
				int end = i;//已经排好的数组的尾部
				int temp = a[end + gap];
				while (end >= 0)
				{
					if (temp < a[end])//小就向前移
					{
						a[end + gap] = a[end];
						end -= gap;
					}
					else
					{
						break;
					}
				}
				a[end + gap] = temp;
			}
		}
	}
}
举报

相关推荐

0 条评论