排序算法:直接插入排序

定义:

直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从  而得到一个新的、记录数量增1的有序表。

思想:

每次将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止;和大家平时玩扑克牌时整理牌的方法差不多,看后面的每张牌,将其插入到前面合适的位置,当整理完最后一张牌时,插入排序就完成了。例如:

 将3和4移动到5的左侧,再将2移动到最左侧,顺序就算是理好了。这就是直接插入排序法。

排序示例:

假设数组有如下8个元素待排序:

 1.首先第一个元素8不动,因为当我们只考虑8这个元素时,它就已经排好序了,如图:(蓝色表示已排好序红色表示待排序元素)

2.看第二个元素6,我们要做的就是将6放到前面数组中合适的位置,显然,6比8要小,所以将6和8调换位置,这样前两个元素就排好序了,如图:

3.再看元素2,2比8小,调换位置,同时2比6小,再和6调换位置,最终2插入到了最前面,结果如图:

4.重复上述方法,将剩余元素调整到数组中合适的位置,最终排序结果如图:

代码实现:

#include<iostream>

using namespace std;

void insertionSort(int arr[], int n) {

	for (int i = 1; i < n; i++) {

		//寻找元素arr[i]合适的插入位置
		for (int j = i; j > 0; j--) {
			if (arr[j] < arr[j - 1])
				swap(arr[j], arr[j - 1]);
			else
				break;
		}
	}
}

int main() {

	int arr[8] = { 8,6,2,3,1,5,7,4 };
	
	cout << "排序前数组:" << " ";
	for (int i = 0; i < 8; i++)
		cout << arr[i] << " ";
	cout << endl;

	insertionSort(arr, 8);

	cout << "排序后数组:" << " ";
	for (int i = 0; i < 8; i++)
		cout << arr[i] << " ";
	cout << endl;

	system("pause");
	return 0;
}

 代码运行结果如图:

算法分析:

最好的情况,也就是要排序的数组本身就是有序的,比如数组是{1,2,3,4,5,6,7,8},只比较元素,没有移动次数,时间复杂度为O(n);

最坏的情况,即待排序的数组元素是逆序的情况,比如{8,7,6,5,4,3,2,1},此时需要比较\sum_{i=2}^{n}i=2+3+...+n=\frac{(n+2)(n-1)}{2}     次,移动次数达到最大值:\sum_{i=2}^{n}(i+1)=\frac{(n+4)(n-1)}{2}

 

综上,直接排序法的时间复杂度为O(n^2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值