常用排序之插入排序法

算法描述
      何为插入排序呢?顾名思义,即向一个有序数据序列中插入一个数,插入此数后的序列仍然有序。

具体描述如下:

      假如有一个数组:
      ⒈ 从第一个元素开始,该元素可以认为已经被排序
      ⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
      ⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
      ⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
      ⒌ 将新元素插入到下一位置中

      ⒍ 重复步骤2~5

       对于P=1趟到P=N-1趟,插入排序保证从位置0到位置P上的元素为已排序状态。插入排序利用了这样的事实:位置0到位置P-1上的元素是已排过序的。如下:

--------------------------------------------------------------

初始       34      8         64       51       32        21

p=1        8       34       64       51       32        21 

p=2        8       34       64       51       32        21 

p=3        8       34       51       64       32        21 

p=4        8       32       34       51       64        21 

p=5        8       21       32       34       51        64 

----------------------------------------------------------------

例程

void Insertion_Sort(int a[], int n)
{
	int i, j, temp;
	for (i = 1; i < n; i++) {
		temp = a[i];
		for (j = i; j > 0 && a[j - 1] > temp; j--)
			a[j] = a[j - 1];
		a[j] = temp;
	}
}
int main()
{
	int b[] = { 9,8,19,4,6,2,3,7,4 };
	Insertion_Sort(b, 9);
	for (auto c : b)
		cout << c << " ";
	system("pause");
}

时间复杂度分析

       由于嵌套循环的每一个都花费N次迭代,因此插入排序为O(N^2)。

       最好的情况是数组时有序排列的,每插入一个元素,只需考查前一个元素,此时的时间复杂度为O(n);

       最坏的情况下,数组完全逆序,插入第2元素要考查前1个元素,插入第3个元素要考查前两个元素,.....,插入第N个元素,要考虑前N-1个元素。因此,最坏情况下的比较次数为1+2+3+...+n-1,结果为n^2/2,此时时间复杂度为O(n^2);

       所以插入排序的平均时间复杂度为O(n^2);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值