数据结构-排序-表插入排序
1.算法思想
- 表插入排序的思想: 在不进行记录的移动的情乱下,西永存储结构的有关信息的改变达到排序的目的。可以给每个记录附加一个指针域 Link,类型为整形,在插入 Ri 时,R1,R2, R3,…已经通过各种的指针域按排序码排序成一个静态链表,将记录 Ri 的排序码key于表中已经排好序的排序码从表头向右依次比较,找到 Ri 的位置,将其插入。
2.算法复杂度
- 执行时间: O(n^2)
- 附加空间: 一个存储记录下标的链表
- 是否是稳定的排序方法: 是
3.算法实现
#include "stdio.h"
#define MAXSIZE 10
typedef int keytype;
typedef struct {
keytype key;
int link;
int other;
}recordtyp;
typedef struct {
int length;
recordtyp r[MAXSIZE + 1];//多一个是储存的附加空间
}table;
table * tableinsertsort(table * tab) {
int q, p, i;
tab->r[0].link = 1; tab->r[1].link = 0; //第一个元素为有序静态表
//从第二个元素开始,依次插入
for (i = 2; i <= tab->length; i++)
{
q = 0;
p = tab->r[0].link;
while (p!=0&&tab->r[i].key>=tab->r[p].key)
{
q = p;
p = tab->r[p].link;
}
tab->r[i].link = p;
tab->r[q].link = i;
}
return tab;
}
table * inputData(table * tab) {
printf("please input the length:\n");
scanf("%d", &tab->length);
printf("please input the data:");
for (int i = 1; i <= tab->length; i++)
{
scanf("%d", &tab->r[i].key);
}
return tab;
}
void show(table * tab) {
printf(" key:");
for (int i = 1; i <= tab->length; i++)
{
printf("| %d |", tab->r[i].key);
}
printf("\n");
printf("link:");
for (int i = 1; i <= tab->length; i++)
{
printf("| %d |", tab->r[i].link);
}
printf("\n");
}
void main() {
table * tab = malloc(sizeof(table));
tab = inputData(tab);
tab = tableinsertsort(tab);
show(tab);
}
运行截图
欢迎大家关注我的博客:breeziness123
转载说明出处