4.插入排序——表插入排序

来源:互联网 发布:2017网络原创歌手 编辑:程序博客网 时间:2024/06/13 02:12

本文针对表插入排序。
这种排序方法采用链表的数据结构,按顺序放入数据,并按插入排序的原理修改next指针,这样能够做到排序时不移动数据。
排序完之后可以按next指向打印数据,也可以移动数据然后按数组下标打印数据。
它的时间复杂度仍是O(n的平方)。

 

 

程序:

#include <stdio.h>#include <stdlib.h>#include <string.h>#include <limits.h>#define MAXSIZE 50typedef 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 - 1l->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;  //修改nextl->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]# ./cbefor sort:5 6     13 5    22 2    2 4     6 5     99 7    6 15    1 22    15 12   58 12print by the 'next':1 22    2 4     5 6     6 5     6 15    13 5    15 12   22 2    58 12   99 7print by sort:1 22    2 4     5 6     6 5     6 15    13 5    15 12   22 2    58 12   99 7


 

0 0