表插入排序
- 实现思想
- 使用链表的存储结构对数据进行插入排序。在对记录按照其关键字进行排序的过程中,不需要移动记录的存储位置,只需要更改结点间指针的指向。
- 在使用数组结构表示的链表中,设定数组下标为 0 的结点作为链表的表头结点,并令其关键字取最大整数。
- 具体实现过程是:首先将链表中数组下标为 1 的结点和表头结点构成一个循环链表,然后将后序的所有结点按照其存储的关键字的大小,依次插入到循环链表中。
- 时间复杂度
- 最好情况:O(n)
- 最坏情况:O(n²)
- 平均时间复杂度:O(n²)
- 空间复杂度
- 稳定性
代码
#include<stdio.h>
#include<limits.h>
#define MaxSize 5
typedef struct{
int key;
int next;
}Rcd;
typedef struct{
Rcd r[MaxSize+1];
int length;
}List;
void InitList(List *L,int s[],int n){
int i;
(*L).r[0].key=INT_MAX;
(*L).r[0].next=0;
(*L).length=5;
for(i=1;i<=n;i++){
(*L).r[i].key=s[i-1];
(*L).r[i].next=-1;
}
}
void arrange(List *L){
int i,p,q;
Rcd tmp;
p=(*L).r[0].next;
for(i=1;i<=(*L).length;i++){
while(p<i)
p=(*L).r[p].next;
q=(*L).r[p].next;
if(p!=i){
tmp=(*L).r[i];
(*L).r[i]=(*L).r[p];
(*L).r[p]=tmp;
(*L).r[i].next=p;
}
p=q;
}
}
void TInsertSort(List *L){
int i,j,k;
for(i=1;i<=(*L).length;i++){
for(k=0,j=(*L).r[k].next;(*L).r[j].key<(*L).r[i].key;k=j,j=(*L).r[k].next);
(*L).r[i].next=j;
(*L).r[k].next=i;
}
arrange(L);
}
void Traverse(List L){
int i;
for(i=1; i<=L.length; i++){
printf("%d ",L.r[i].key);
}
printf("\n");
}
void main(){
List L;
int n=5,s[5]={49,38,76,13,27};
InitList(&L,s,n);
TInsertSort(&L);
printf("排序后的结果为:\n");
Traverse(L);
}