本文针对表插入排序。
这种排序方法采用链表的数据结构,按顺序放入数据,并按插入排序的原理修改next指针,这样能够做到排序时不移动数据。
排序完之后可以按next指向打印数据,也可以移动数据然后按数组下标打印数据。
它的时间复杂度仍是O(n的平方)。
程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#define MAXSIZE 50
typedef struct{
int key;
int other;
}node;
typedef struct
{
node data;
int next;
}lnode;
typedef struct
{
lnode array[MAXSIZE];
int length;
}list;
//将数组data中的数据依次放到静态链表,并做插入排序,调整next指向的位置
void table_insert(list *l,node *data,int n)
{
int i,higher,lower;
l->array[0].data.key = INT_MAX; //array[0]存放最大整数,不存放data数组的数据,所以实际数据量是length - 1
l->array[0].next = 0;
for(i = 0;i < n;i++){
l->array[i + 1].data = data[i];
lower = 0;
higher = l->array[0].next;
while(l->array[higher].data.key <= l->array[i + 1].data.key){ //找l->array[i + 1].data.key应该插入到的位置,用lower记录应该插入位置的前一个位置,用higher记录应该插入位置的后一个位置
lower = higher;
higher = l->array[higher].next;
}
l->array[i + 1].next = higher; //修改next
l->array[lower].next = i + 1;
}
l->length = n;
}
//根据next指向移动数据
void table_insertion_sort(list *l)
{
int i,next,q;
lnode t;
next = l->array[0].next; //next表示下一个需要移动的数据位置
for(i = 1;i < l->length;++i){ //i之下是已经移动好的数据
while(next < i)
next = l->array[next].next;
q = l->array[next].next; /* q指示尚未调整的表尾 */
if(next != i){
t = l->array[next];
l->array[next] = l->array[i];
l->array[i] = t;
l->array[i].next = next; //移走了原来的数据,那么比其小的数据的next域将不再能指向它,所以为了防止该值丢失,就用l->array[i]指向它,当以后那个比它小的数据指向它时,就用其指向位置的next所指向的位置替代,并用while循环确保其指向位置不在比i小的地方
}
next = q;
}
}
//按next顺序打印
void print_next(list *l)
{
int i;
lnode temp = l->array[l->array[0].next];
for(i = 0;i < l->length;i++){
printf("%d %d\t",temp.data.key,temp.data.other);
temp = l->array[temp.next];
}
printf("\n");
}
//按静态链表下标顺序打印
void print_array(list *l)
{
int i;
for(i = 1;i <= l->length;i++)
printf("%d %d\t",l->array[i].data.key,l->array[i].data.other);
}
//按数据大小获取数组的next值放到adr数组
void sort(list *l,int *adr) //adr数组下标表示第几个小,值表示位置
{
int i,p = l->array[0].next;
for(i = 1;i <= l->length;i++){
adr[i++] = p;
p = l->array[p].next;
}
}
void main()
{
node data[10]={{5,6},{13,5},{22,2},{2,4},{6,5},{99,7},{6,15},{1,22},{15,12},{58,12}};
list l;
table_insert(&l,data,10);
printf("befor sort:\n");
print_array(&l);
printf("\nprint by the 'next':\n");
print_next(&l);
table_insertion_sort(&l);
printf("print by sort:\n");
print_array(&l);
printf("\n");
}
结果:
[19:21:31]# ./c
befor sort:
5 6 13 5 22 2 2 4 6 5 99 7 6 15 1 22 15 12 58 12
print by the 'next':
1 22 2 4 5 6 6 5 6 15 13 5 15 12 22 2 58 12 99 7
print by sort:
1 22 2 4 5 6 6 5 6 15 13 5 15 12 22 2 58 12 99 7