插入排序

以前在新浪微博上写了几篇文章,发现编程的东西还是这里写比较好,毕竟专业人士扎堆的地方。

插入排序属于减治法的一种。

废话不说,先上代码。健壮性有点问题,但是插入排序的思想是没有问题的。

#include<iostream>
struct list{
	int data;
	list *next;
};
void addNode(list *tmp,int t){
	list *p;
	p = (list *)malloc(sizeof(list));
	p->data = t;
	p->next = NULL;
	while(tmp->next)tmp = tmp->next;
	tmp->next = p;	
}
void insertionSort(list *tmp){
	list *current;
	if(!tmp->next)return;
	current = tmp->next;
	while(current->next){
		list *p=tmp;
		while(p!=current){
			if(current->next->data <= p->next->data){
				list *TT;
				TT = p->next;
				p->next = current->next;
				current->next = current->next->next;
				p->next->next = TT;
				break;
			}
			p = p->next;
		}
		if(p==current)current = current->next;
	}
}
int main()
{
	using namespace std;
	list *head,*p;
	head = (list *)malloc(sizeof(list));
	head->next = NULL;
	p = head;
	addNode(p,89);
	addNode(p,45);
	addNode(p,68);
	addNode(p,90);
	addNode(p,29);
	addNode(p,34);
	addNode(p,17);
	insertionSort(head);
	p = head->next;
	while(p){
		cout<<p->data<<" ";
		p = p->next;
	}
	cout<<endl;
	p = head;
	while(head){
		head = head->next;
		free(p);
		p = head;
	}
}
关于插入排序时间复杂度的讨论:

最好的情况下,也就是对于每个数据只进行一次比较,属于Θ(n)的时间。对于逆序数列的排序就属于这种情况。

最坏的情况下,也就是对于已经排好序的数列进行排序。

第一次数据    比较0次;

第二个数据    比较1次;

第三个数据    比较2次;

...................................

第n个数据     比较n-1次;

显然最坏的情况下,时间复杂度为O(n^2)。至于平均情况下的插入排序,比最坏的情况下性能快2倍,比蛮力法的一些排序方法效果好。

然而插入排序也有其不足之处,如果待排序的是数组或者顺序表,也要考虑插入时其他数据的移动时间。所以在使用的时候应该酌情考虑。

对于较大文件的排序,插入排序也有其改进版本即shell排序,感兴趣的朋友可以查阅相关的文章。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值