1. 程式人生 > >內部排序->插入排序->其它插入排序->表插入排序

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

com 算法 其他 inf gif 時間 pla 長度 直接插入排序

文字描述

  和之前的插入排序比,表插入排序可以保證排序過程中不移動記錄;因此表插入排序所用的存儲結構和之前的順序存儲不同,表插入排序采用靜態鏈表類型作為待排記錄序列的存儲結構,設數組中下標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]$

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