常见的排序——插入排序(直接插入排序和希尔排序)

插入排序:插入排序分为直接插入排序、希尔排序。希尔排序是直接插入排序的优化算法。
直接插入排序基本思想是:把待排序的数按照其大小逐个插入到已经排序好的有序序列中,直到所有的插入结束得到一个新的序列。

void InsertSort(int array[], int size)
{
	for (int i = 1; i < size; i++){
		int k = array[i];
		int j;
		for (j = i - 1; j >= 0; j--){
			if (array[j]<=k){
				break;
			}
			//进行数据向后的搬移
			array[j + 1] = array[j];
		}
		//将原来的数据插入到搬移以后留下的位置
		array[j + 1] = k;
	}
}

直接插入排序的特性总结:时间复杂度O(n*n),空间复杂度O(1),是一个稳定的排序。元素集合越接近有序,直接插入排序算法的时间效率越高。其外部的循环实现减治过程,一次取一个数插入到前面的有序区间内(有序区间进行向后面搬移)。其内部循环实现的是插入过程。

希尔排序基本思想是:先选定一个整数,把待排序中的数分成组,所有距离为在同一个组内,并对每一个组进行排序。然后重复上述分组的过程,当组距达到1时,说明已经有序了。

void InsertSortWithGap(int array[], int size, int gap)
{
	for (int i = 1; i < size; i++){
		int k = array[i];
		int j;
		for (j = i - gap; j >= 0; j -= gap){
			if (array[j]<=k){
				break;
			}
			//进行数据搬移
			array[j + gap] = array[j];
		}
		//将原来的数据插入到搬移以后留下的位置
		array[j + gap] = k;
	}
}
void ShellSort(int array[], int size)
{
	int gap = size;
	while (1){
		gap = gap / 3 + 1;
		InsertSortWithGap(array, size, gap);
		if (gap == 1){
			break;
		}
	}
}

希尔排序的特性总结:时间复杂度O(n^1.3–n*n),空间复杂度O(1),是一个不稳定的排序。当gap>1时都是预排序,目的是为了让数组更接近与有序。当gap==1时,数组已经接近有序了。

猜你喜欢

转载自blog.csdn.net/weixin_43198968/article/details/88549739