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
- 4.插入排序——表插入排序
- 插入排序—直接插入
- 插入排序——折半插入排序
- 插入排序——直接插入排序
- 插入排序——折半插入排序
- 插入排序——直接插入排序
- 插入排序——直接插入排序
- 插入排序——直接插入排序
- 插入排序——直接插入排序
- 插入排序—直接插入排序
- 插入排序:表插入
- 插入排序(二)— 表插入排序
- 排序——插入排序
- 排序——插入排序
- 排序——插入排序
- 排序——插入排序
- 排序——插入排序
- 排序——插入排序
- 苹果App删除 AppStore应用删除指南
- POJ3228 并查集或二分最大流枚举答案
- 直接插入排序
- python使用Tkinter编写GUI
- eclipse+Android 开发环境的配置
- 4.插入排序——表插入排序
- 2013年终总结
- 网页加载
- HDU 2151 Worm
- IOS开发创建开发证书及发布App应用指南
- Lua学习笔记四之用C为Lua定义类型(UserData)
- 雾里看JavaScript
- Tomcat 7的WebSocket实现(下)
- matlab中如何使用外部工具箱