現在介紹一下表插入排序。 這種排序算法和直接插入排序很像,
每一個節點都存在一個 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;
}
上面這段代碼完成了直接插入的過程,讓這個表變得有序。下面一節 再去記錄 整理爲又小到大的排列過程。