2016年7月27日18:13:11
假设用户数据为:[22,6,17,8]
数据的存贮:pHead->[22]->[6]->[17]->[8]
链式存贮结构来保存待排序的数据,首先创建一个链表,将待排序的所有元素存贮到链表中去,将待排序的链表分为两部分
:有序子集和待排序子集,初始时有序子集中没有元素,令pSort->pNext = NULL,指针pCur指向待排序的链表节点,遍历待排序的子集
如果有序子集为空,那么将pTemp = pCur;pCur = pCur->pNext;然后将pTemp所指向的结点插入到有序子集中pSort->pNext = pTemp;
pTemp->pNext = NULL;
如果有序子集不为空,那么设置一个qCur指针来遍历有序子集,从前往后遍历,初始时pCur = pSort->pNext,将pTemp所指向的结点中数据
与pCur所指向的结点进行比较,
1>如果比第一个小,就说明它比后面的一定小,它就是最小的,直接插入到第一个的前面,那么要插入到qCur所指向结点的前面,那么
就应该在设置一个指针让其指向qCur前面的那个结点,这样才能确保将元素进行插入.
2>如果比qCur所指向的元素大,就说明该元素应该放在qCur所指向元素的后面元素的某个位置,就pCur = pCur->pNext,如果发现小于
pCur就直接执行1操作,
__________________________________________________________________________________________________________________
注意:如果pTemp所指向的元素比pCur指向的元素相等,为了保证排序的稳定性,那么它应该放在后面,即执行和大于相同的操作;
__________________________________________________________________________________________________________________
3>如果pTemp所指向的元素比有序表中的最后一个元素还要大,那么直接插入有序表的尾部,
4>当待排序的元素遍历完毕的时候,该算法就执行完毕了;
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define len 100
#define random(x) (rand()%x)
typedef struct node
{
int data;
struct node * pNext;
}linkList;
void initLinkList(linkList ** pHead);
void traverseLinkList(linkList * pHead);
linkList * createLinkList(linkList * pHead);
void insertSort(linkList * pHead);
void initLinkList(linkList ** pHead)
{
*pHead = (linkList * )malloc(sizeof(linkList));
if(!(*pHead))
{
printf("动态内存分配失败!\n");
exit(-1);
}
(*pHead)->pNext = NULL;
return;
}
void traverseLinkList(linkList * pHead)
{
linkList * pCur;
pCur = pHead->pNext;
if(!pCur)
{
printf("链表为空!\n");
return;
}
while(pCur)
{
printf("%-5d",pCur->data);
pCur = pCur->pNext;
}
return;
}
linkList * createLinkList(linkList * pHead)
{
int i;
linkList * pNew;
linkList * pTail;
pTail = pHead;
pHead->data = 0;
for(i = 0;i<len;i++)
{
pNew = (linkList * )malloc(sizeof(linkList));
if(!pNew)
{
printf("动态内存分配失败!\n");
exit(-1);
}
pNew->data = random(1000);
pNew->pNext = NULL;
pTail->pNext = pNew;
pTail = pNew;
pHead->data ++;
}
return pHead;
}
void insertSort(linkList * pHead)
{
linkList * pCur ,* pPrev;
linkList * qCur ,* qPrev;
pPrev = pHead;
pCur = pHead->pNext;
qCur = pCur->pNext;
pCur->pNext = NULL;
while( qCur )
{
pPrev = pHead;
pCur = pPrev->pNext;
while( pCur )
{
if(qCur->data<pCur->data)
{
break;
}
else
{
pPrev = pCur;
pCur = pCur->pNext;
}
}
qPrev = qCur;
qCur = qCur->pNext;
qPrev->pNext = pCur;
pPrev->pNext = qPrev;
}
return ;
}
int main(void)
{
linkList * pHead;
initLinkList(&pHead);
pHead = createLinkList(pHead);
printf("随机产生的数据为:\n");
traverseLinkList(pHead);
printf("\n");
insertSort(pHead);
printf("排序后的数据为:\n");
traverseLinkList(pHead);
printf("\n");
return 0;
}