以前在新浪微博上写了几篇文章,发现编程的东西还是这里写比较好,毕竟专业人士扎堆的地方。
插入排序属于减治法的一种。
废话不说,先上代码。健壮性有点问题,但是插入排序的思想是没有问题的。
#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排序,感兴趣的朋友可以查阅相关的文章。