算法导论-插入排序

算法导论中的第一章是算法入门,开头的一个例子是关于插入排序的。

插入排序的过程:

将一个数组分成有序部分和无序部分(刚刚开始有序部分为第一个元素),然后将无序部分的第一个元素与有序部分的元素从前往后比较(也可以从后往前),符合要求时将这个元素插入数组中,当然了,有序部分的一些元素需要依次往后移一个,以便腾出位置插入。

例如一个数组:3 ,6,9,10,2,7 (按升序)

1. 一开始3是有序部分,比较6与3,符合,所以3,6已经排好序,称为了有序部分。

2. 同理经比较9,10也排好序了,3,6,9,10是有序部分。

3. 2与3比较,2小于3,那么3,6,9,10依次往后移一个位置,将2插入原来3的位置。2,3,6,9,10为有序部分。

4. 将7分别于2,3,6,9比较,当与9比较时发现9大于7,那么9,10依次往后移一个,将7插入原来9的位置。


自己写的c++代码实现:

/*=======================================
*Author: Fang Jie

*Date: 2014-2-26

*Function: InsertionSort

*Parameter: a[]为无序数组,NUM为数组个数

*Description: 按升序进行插入排序

=========================================*/

void InsertionSort(int a[], int NUM)
{
	for (int i = 1; i < NUM; i++){				//从第二个数据开始
		for (int j = 0; j < i; j++){			
			if (a[j] > a[i]){					//找到要插入的位置
				int temp = a[i];
				for (int k = i; k > j; k--){	//将插入位置后的元素往后移
					a[k] = a[k - 1];
				}
				a[j] = temp;					//插入元素
			}
		}
	}
}

然后从网上参考了一下其他人的例子,可以进行部分该进。

/*=======================================
*Author: Fang Jie

*Date: 2014-2-26

*Function: InsertionSort

*Parameter: a[]为无序数组,NUM为数组个数

*Description: 按升序进行插入排序

=========================================*/

void InsertionSort(int a[], int NUM)
{
	for (int i = 1; i < NUM; i++){				//从第二个数据开始
		int j = 0;			
		while (j < i && a[j] <= a[i])			//找到要插入的位置
			j++;
		if (j < i){					
			int k = i;
			int temp = a[i];
			while (k > j){						//挪动位置
				a[k] = a[k - 1];
				k--;
			}		
			a[k] = temp;						//插入元素
		}
	}
}

主要是将while代替了for循环。

让我们来看看for,while,do-while各在什么时候使用

计数控制的循环用for语句表达;事件控制的循环则用while或do-while语句实现。其中,如果循环体至少要执行一次,则用do-while。

显然这里找位置和挪动位置宜使用while。


插入排序算法分析:

平均时间复杂度:O(n2)

空间复杂度: O(1)


刚才我们是从前向后插入,现在实现从后向前插入,这时我们可以比较一个移一个,不用找到了位置再移,可以看见代码变得少了。

/*=======================================
*Author: Fang Jie

*Date: 2014-2-26

*Function: InsertionSort

*Parameter: a[]为无序数组,NUM为数组个数

*Description: 按升序进行插入排序

=========================================*/

void InsertionSort(int a[], int NUM)
{
	for (int i = 1; i < NUM; i++){				//从第二个数据开始
		int j = i - 1;
		int temp = a[i];
		while (j >= 0 && a[j] > a[i]){			//从后向前
			a[j + 1] = a[j];					//挪动
			j--;
		}
		if (j != i - 1)
			a[j + 1] = temp;					//插入数据
		}
}

当然,当数组个数很大时,假设还是使用插入排序,在查找插入位置时可以使用二分查找,提高速度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值