单链表直接插入排序
2011-10-17 02:00
267 查看
今天看到顺序表的插值排序,所以研究了一下,想在链表上用直接插入排序。
总的思想:最前面的一个数据节点则默认为有序,那么后面的n-1个数据节点为无序。将无序的节点一个一个插到有序链表合适的位置中,直到所有的节点都插完,就可形成一个有序链表。
具体方法:
首先创建链表:
//Link List structure
typedef struct node
{
int Data;
struct node *next;
}LinkList;
// create linklist
LinkList *head, *pNode;
head = NULL;
int Data = 0;
while ( Data < 9 )
{
LinkList *pNode = new LinkList();
pNode->Data = rand()%10;
pNode->next = head;
head = pNode;
Data = Data + 1;
}
Data = 0;
//注意这里不能直接使用head->next,它会移动指针
pNode = head;
while(Data < 9)
{
printf("%d n", pNode->Data);
pNode = pNode ->next;
Data = Data + 1;
}
下面开始排序:
第一步、、判断是否只有一个头节点或者只有一个数据节点?
如果是的话,那当然就不用排序了。因为已经成有序了。
Link Sort(Link Head)
{//我创建的是带头节点的链表。
if(!Head->next||!Head->next->next)//此步条件判断非常有价值。
return Head;
第二步:既然有多个数据节点,那就要排序了。此步做初始工作:先将一个整个链表分成一个有序链表和一个无序链表。如图形式2。
Link Sort(Link Head)
{//我创建的是带头节点的链表。
if(!head->next||!head->next->next)//此步条件判断非常有价值。
return Head;
ptr=head->next->next;
ptr_F=head;
head->next->next=NULL;//到此,分成了两个链表。
第三步:现在正式开始!(此步骤需要注意:不要让后面的无序链表断了,找不着了。)
Link Sort(Link Head)
{//我创建的是带头节点的链表。用直接插入法。
if((head->next==NULL)||(nead->next->next==NULL))//此步条件判断非常有价值。
{
cout<<"数据节点数少于2个,不用排序!"<<endl;
return Head;
}
//-----------第二步;
Link ptr;
Link ptr_F;
Link ptr_N;
ptr=nead->next->next;
ptr_F=Head;
head->next->next=NULL;//到此,分成了两个链表。
//第三步。
while(ptr)
{
ptr_N=ptr->next;
ptr_F=head;//ptr_F的归位。
while(ptr_F->next)
{
if(ptr->Data>ptr_F->next->Data)
{
ptr->next=ptr_F->next;
ptr_F->next=ptr;
break;
}
else
{
if(ptr_F->next->next )
ptr_F = ptr_F->next;
else
{
ptr->next = ptr_F->next->next;
ptr_F->next->next = ptr;
break;
}
}
}
ptr = ptr_N;
}
}//while(ptr)
cout<<"从高到低,排序成功!"<<endl;
return Head;
}
反转链表分两种方法,循环算法和递归算法,其中递归算法如下:
Linklist* resverse(Linklist *l)
{
if(l == NULL || l->pNext == NULL)
return l;
Linklist *n = resverse(l->pNext);
l->pNext->pNext = l;
l->pNext = NULL;
return n;
}
相关文章推荐
- 用单链表对直接插入排序的简单实现
- C/C++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)
- 单链表---直接插入排序
- 链表排序-直接插入排序
- 用直接插入排序法对单链表进行排序
- 用链表实现直接选择排序和直接插入排序
- 【数据结构】 单链表的基本操作+反转+选择/直接插入/冒泡3种排序
- C/C++,数据结构实现两个链表的合并(尾插法建立单链表,求链表长度,直接插入排序)
- 嵌入式 用链表实现直接选择排序和直接插入排序示例
- 直接插入排序 Java
- 直接插入排序、折半插入排序、shell插入排序
- 【排序算法】之直接插入排序
- 直接插入排序
- 算法笔记:(一)插入排序:直接插入排序(Straight Insertion Sort)
- 直接插入排序
- 【数据结构】排序算法(一)之直接插入排序,冒泡排序
- 南京邮电大学OJ——1062直接插入排序
- 直接插入排序
- 直接插入排序(C语言实现)
- 链表插入排序