插入排序及其应用

1.直接插入排序

从第二个元素开始依次插入前面有序的数组(第一个数只有一个所以有序)
首先寻找插入的位置(比较大小,比他的后移直到比他小说明找到位置),最后插入
空间复杂度o(1),最好时间复杂度o(n)<已经是有序序列>,平均和最差时间复杂度o(n^2)
void insertsort(int a[], int n)
{
	int i, j;
	for (i = 1; i < n; i++)
	{
		if (a[i] < a[i - 1])
		{
			int temp = a[i];
			for (j = i - 1; a[j] > temp; j--)
				a[j + 1] = a[j];//依次后移
			a[j+1] = temp;//因为for最后一次j--了,空的地方是j+1
		}
	}
}
直接插入排序首先是移动元素为了找到合适的插入位置,因此此时前面
元素已经有序,所以可以用折半查找来寻找插入位置
时间复杂度o(n^2),空间复杂度o(1)
void insertsort1(int a[], int n)
{
	int i, j;
	for (i = 1; i != n; i++)
	{
		int temp = a[i];
		int low = 1, high = i - 1;//这之前的元素已经有序
		while (low <= high)
		{
			int mid = (low + high) / 2;
			if (a[mid] > a[i])high = mid - 1;//查找左半子表
			else
				low = mid + 1;//查找右半子表
				//若相等 ,查找右半子表的结果是插入位置是high=low-1=mid也是查找到的位置
		}//循环结束时high+1=low,新元素插入位置为high
		for (j = i - 1; j >= /*high + 1*/low; --j)
			a[j + 1] = a[j];
		//a[high + 1] = temp;
		a[low] = temp;
	}
}
希尔排序<直接插入排序>
将待排序元素序列分割为若干个子序列(按相隔某个增量组成的)
然后分别进行直接插入排序,然后再缩减增量进行排序,待整个
序列基本有序后,再对整体元素进行一次直接插入排序
时间复杂度o(n^2),空间复杂度o(1)
void shellsort(int a[], int n)
{
	int i, j, gap,temp;
	for (gap = n / 2; gap > 0; gap /= 2)//gap是增量,从n/2开始缩减
		for (i = gap; i != n; i++)
		{
			if (a[i] < a[i - gap])
			{
				temp = a[i];
				for (j = i - gap; j >= 0 && a[j] > temp; j -= gap)//寻找每个小组插入位置
					a[j + gap] = a[j];
				a[j + gap] = temp;
			}
		}
}

猜你喜欢

转载自blog.csdn.net/weixin_43425693/article/details/89948248