表插入排序采用链式存储,避免了元素移动。而且采用的是静态链表
静态链表的结构:
key |
---|
next |
eg:
MAXINT | 49 | 38 | 65 | 97 | 76 | 13 | 27 | 49 |
---|---|---|---|---|---|---|---|---|
6 | 8 | 1 | 5 | 0 | 4 | 7 | 2 | 3 |
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SIZE 10
typedef int RcdType;
typedef struct
{
RcdType rc;
int next;
/* data */
}SLNode;
typedef struct
{
SLNode r[SIZE+1]; //r[0]位是头结点,只存next
int length;
/* data */
}SLinkListType;
void init(SLinkListType *p){
p->length = SIZE+1;
(*p).r[0].next = 1;
int i;
srand((unsigned int)time(NULL));
for(i=1; i<(*p).length; i++){
(*p).r[i].rc=10+rand()%30;
//(*p).r[i].next = 0;
}
printf("排序前:");
//L.length=MAXSIZE;
for(i=1;i<(*p).length;i++){
printf("%3d",(*p).r[i].rc);
}
printf("\n");
}
//静态链表
void TableInsertSort(SLinkListType *p){
for(int i=2; i< (*p).length; i++){
int first=0;
int last=(*p).r[0].next;
while((*p).r[last].rc <= (*p).r[i].rc && last){
first = last;
last = (*p).r[last].next;
}
(*p).r[first].next = i;
(*p).r[i].next = last;
}
}
void show(SLinkListType *p){
int q = (*p).r[0].next;
printf("排序后:");
while(q != 0){
printf("%3d",(*p).r[q].rc);
q = (*p).r[q].next;
}
}
int main(){
SLinkListType list;
init(&list);
TableInsertSort(&list);
show(&list);
return 0;
}