现在介绍一下表插入排序。 这种排序算法和直接插入排序很像,
每一个节点都存在一个 next域 来指示 这个节点的下一个节点, 和链表有点像,
在插入的过程当中就保证当前已经根据他们的next指向的位置 而链成了一个有序的列表,然后第二步 再帮这个表按照顺序整理为一个 新的 按照大小顺序 而排列的表。
首先演示一下插入的过程, 下面是具体的实验代码:
#define SIZE 8
typedef struct
{
int data;
int next;
}s_node;
typedef struct
{
s_node r[SIZE + 1];
}list_type;
void TB_sort(list_type & list)
{
list.r[0].next = 1;
list.r[1].next = 0; //初始状态
int p, q;
for (int i = 2; i <= SIZE; i++)
{
p = list.r[0].next;
q = 0;
while (p > 0 && list.r[p].data <= list.r[i].data)
{
q = p;
p = list.r[p].next;
}
list.r[q].next = i;
list.r[i].next = p;
}
}
int main(int argc, char* argv[])
{
s_node node[SIZE + 1];
node[0].data = 0;//这个节点用作哨兵节点
node[1].data = 23;
node[2].data = 324;
node[3].data = 23;
node[4].data = 333;
node[5].data = 98;
node[6].data = -1;
node[7].data = 45;
node[8].data = -345;
list_type list;
memcpy(list.r, node, sizeof(s_node) * (SIZE + 1));
TB_sort(list);
int temp = list.r[0].next;
for (int i = 1; i<=SIZE; i++ )
{
printf("%d ", list.r[temp].data);
temp = list.r[temp].next;
}
system("pause");
return 0;
}
上面这段代码完成了直接插入的过程,让这个表变得有序。下面一节 再去记录 整理为又小到大的排列过程。