插入排序——直接插入排序和shell排序

1. 排序的分类

2. 直接插入排序

(1)算法思想:

        直接插入排序是一种简单的排序算法,将第一个元素看作有序子序列,从第二个元素开始,和前一个元素比较,若小于,将前一个元素向后移,将第二个元素插入到有序子序列中;若大于,直接将第二个元素插入到有序子序列中。按这种过程继续下去,直到完成所有的有序子序列。

(2)基本实现:

void InsertSort(DataType arr[], int sz)
{
	int key = 0;
	for (int i = 1; i < sz; i++)
	{
		key = arr[i];
		int j = i - 1;
		while (j>=0&&key<arr[j])
		{
			arr[j + 1] = arr[j];
			j--;
		}
		arr[j+1] = key;
	}
}

(3)算法性能:

      时间复杂度:  最坏情况下,即元素逆序时,为O (n^2);

                             最好情况下,即元素刚好是有序的,为O (n);

                            一般情况下,为O (n^2);

      空间复杂度:O (1);

      稳定性:稳定的;

3. 二分插入排序

(1)算法思想:当元素逆序时,利用直接插入思想排序时,元素之间的比较次数是(n (n+1) )/2;但是我们知道,在元素有序时,利用二分查找算法可以高效的找到元素的位置。那么,我们可以利用二分查找算法先找到要插入的元素的位置,这样可以减少元素之间的比较次数,提高算法的效率。

(2)基本实现:

void BinInsertSort(DataType* arr, int sz)
{
	for ( int i = 1; i < sz; i++)
	{
		int key = arr[i];
		int left = 0;
		int right = sz - 1;
		while (left <= right)
		{
			int mid = left + ((right - left) >> 1);
			if (arr[mid]>key)
				right = mid - 1;
			else 
				left = mid + 1;

		}
		for (int j = i - 1; j >= left; --j)
		{
			arr[j + 1] = arr[j];
		}
		arr[left] = key;
	}
	
}

(3)算法性能:

                         时间复杂度:O (n^2)

                         空间复杂度:O (1)

                         稳定性:稳定

4. shell 排序

(1)算法思想:

shell (希尔)排序是在直接插入排序上的改进。是先将整个待排序的序列按照一定的规则(或者利用gap=gap/3+1,或者指定增量序列increase)划分成若个子序列,对每个子序列进行直接插入排序,等到整个序列基本有序时,在对全体数据进行一次直接插入排序。

(2)基本实现:

void ShellSort(DataType * arr, int sz)
{
	int gap = 1;
	while (gap < sz)
	{
		gap = gap * 2 + 1;

	}
	while (gap>0)
	{
		for (int i = gap; i < sz; i++)
		{
			int key = arr[i];
			int j = i - gap;
			while (j>=0 && key < arr[j])
			{
				arr[j + gap] = arr[j];
				j = j - gap;
			}
			arr[j + gap] = key;
		}
		gap = gap / 3;
	}
}

(3)算法性能:

                      时间复杂度:O(n^1.5)

                      空间复杂度:O (1)

                      稳定性:不稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值