码迷,mamicode.com
首页 > 编程语言 > 详细

内部排序->插入排序->其它插入排序->表插入排序

时间:2018-07-21 19:50:38      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:play   运行   辅助   pre   str   tab   操作   sed   max   

文字描述

  和之前的插入排序比,表插入排序可以保证排序过程中不移动记录;因此表插入排序所用的存储结构和之前的顺序存储不同,表插入排序采用静态链表类型作为待排记录序列的存储结构,设数组中下标0的分量为表头结点,并令表头结点记录的关键字取最大整数MAXINT。表插入排序的基本操作仍然是将一个记录插入到已经排好序的有序表中,和直接插入排序有相似之处,不同之处在于是以修改2次指针值代替1次移动记录。

示意图

技术分享图片

 

算法分析

  时间复杂度仍然是n*n, 因为排序过程中需要和数据个数相同的指针值,所以辅助空间为n,是稳定的排序方法。

 

代码实现

技术分享图片
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 //静态链表容量
 5 #define SIZE 100
 6 //最大整数
 7 #define MAX  100000
 8 
 9 #define EQ(a, b) ((a) == (b))
10 #define LT(a, b) ((a) <  (b))
11 #define LQ(a, b) ((a) <= (b))
12 
13 //定义关键字类型为整数类型
14 typedef int KeyType;
15 //定义其它数据项为整数类型
16 typedef int InfoType;
17 
18 //记录类型
19 typedef struct{
20     //关键字项
21     KeyType key;
22     //其他数据项
23     InfoType otherinfo;
24 }RedType;    
25 
26 //表结点类型
27 typedef struct{
28     //记录项
29     RedType rc;
30     //指针项
31     int next;
32 }SLNode;
33 
34 //静态链表类型
35 typedef struct{
36     //0号单元为表头结点
37     SLNode r[SIZE];
38     //链表当前长度
39     int length;
40 }SLinkListType;
41 
42 //顺序打印静态链表中的关键字和指向下个数据的指针
43 void PrintSList(SLinkListType SL)
44 {
45     int i = 0;
46     printf("len:%d; data:\n\n", SL.length);
47     for(i=0; i<=SL.length; i++){
48         printf("\t[%d]key=%d,\tnext=%d\n", i, SL.r[i].rc.key, SL.r[i].next);
49     }
50     printf("\n");
51     return ;
52 }
53 
54 //表插入排序算法
55 void TableInsertSort(SLinkListType *SL)
56 {
57     //0号位表头结点,存最大整数值MAX
58     SL->r[0].rc.key = MAX;
59     //首先将静态链表中数组下标为1的分量和表头结点构成一个循环链表
60     SL->r[0].next = 1;
61     SL->r[1].next = 0;
62 
63     //和直接插入排序相似,只是不移动记录,只是改变指针指
64     int i = 0, q = 0, p = 0;
65     for(i=2; i<=SL->length; i++){
66         q = 0;
67         p = SL->r[q].next;
68         while(LT(SL->r[p].rc.key, SL->r[i].rc.key)){
69             q = p;
70             p = SL->r[q].next;
71         }
72         //以修改2次指针值代替移动记录
73         SL->r[q].next = i;
74         SL->r[i].next = p;
75     }
76     return ;
77 }
78 
79 int main(int argc, char *argv[])
80 {
81     if(argc < 2){
82         return -1;
83     }
84     SLinkListType SL;
85     int i = 0;
86     for(i=1; i<argc; i++){
87         if(i>SIZE)
88             break;
89         SL.r[i].rc.key = atoi(argv[i]);
90         SL.r[i].next = 0;
91     }
92     SL.length = (i-1);
93     TableInsertSort(&SL);
94     PrintSList(SL);
95     return 0;
96 }
表插入排序

 

运行

[jennifer@localhost Data.Structure]$ ./a.out 4 5 7 34 5 23
len:6; data:

[0]key=100000, next=1
[1]key=4, next=5
[2]key=5, next=3
[3]key=7, next=6
[4]key=34, next=0
[5]key=5, next=2
[6]key=23, next=4

[jennifer@localhost Data.Structure]$

内部排序->插入排序->其它插入排序->表插入排序

标签:play   运行   辅助   pre   str   tab   操作   sed   max   

原文地址:https://www.cnblogs.com/aimmiao/p/9347654.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!