Sort a linked list using insertion sort.
思路。
插入排序的思想,对于任意要插入的数n,前n-1项是有序的,那么只要找到在n-1项中要插入的位置即可。一般插入排序针对于数组,可以用交换的方法来做,这样可以不用后移插入之后的元素。
针对于链表,其实思路更加清楚。1,找到要插入的位置;2,插入。
#include <iostream>
using namespace std;
struct LinkNode
{
int data;
LinkNode *next;
LinkNode(int x):data(x),next(NULL){}
};
//找到要插入位置的前驱
LinkNode* findInsertPosition(LinkNode *dummy,int x)
{
LinkNode *pre = dummy;
while(pre->next!=NULL)
{
LinkNode *cur = pre->next;
if(x<=cur->data) return pre;
pre = pre->next;
}
}
LinkNode * insertionSortList(LinkNode *head)
{
LinkNode *cur;
LinkNode *dummy = new LinkNode(-1);
//dummy->next = head;
cur = head;
while(cur)
{
LinkNode *pos = findInsertPosition(dummy,cur->data);
LinkNode *tmp = cur->next;
cur->next = pos->next;
pos->next = cur;
cur = tmp;
}
head = dummy->next;
delete dummy;
return head;
}
//对链表初始化
LinkNode *initLink(LinkNode *dummy,int array[],int len)
{
LinkNode *head,*tmp;//dummy表示哑节点,head一般表示头指针,它指向第一个节点。
tmp = dummy;
//用尾插法
for(int i = 0;i < len;i++)
{
LinkNode *p = new LinkNode(array[i]);
tmp->next = p;
tmp = tmp->next;
}
head = dummy->next;
delete dummy;
return head;
}
//显示list
void showList(LinkNode *head)
{
while(head)
{
printf("%d ",head->data);
head = head->next;
}
printf("\n");
}
//摧毁链表
void destroyList(LinkNode *head)
{
LinkNode *dummy = new LinkNode(-1);
dummy->next = head;
LinkNode *pre,*cur,*tmp;
pre = dummy;
cur = pre->next;
while(cur)
{
tmp = cur->next;
pre->next = tmp;
delete cur;
cur = tmp;
}
delete dummy;
printf("The list has been destroyed!\n");
}
void main()
{
LinkNode *dummy = new LinkNode(-1);
int array1[] = {2,4,1,7,5,9,10,6};
int len1 = sizeof(array1)/sizeof(int);
LinkNode *head = initLink(dummy,array1,len1);
showList(head);
head = insertionSortList(head);
showList(head);
destroyList(head);
}