ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

希尔排序(缩小增量排序)

2019-03-31 11:37:58  阅读:216  来源: 互联网

标签:dk int void length 希尔 Sqlist 增量 排序 data


 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 
 4 typedef struct
 5 {
 6     int *data;
 7     int length;
 8 }Sqlist;
 9 
10 
11 /*顺序表的初始化*/
12 void InitList(Sqlist &L, int l)
13 {
14     L.data = (int*)malloc((l+1)*sizeof(int));
15     L.length = 0;
16 }
17 
18 void CreateLList(Sqlist &L, int *a, int l)
19 {
20     L.length = 1;
21     for(int i=1; i<=l; i++)
22     {
23         L.data[i] = a[i-1];
24         L.length++;
25     }
26 }
27 
28 
29 /*
30     实现希尔排序(缩小增量排序)
31     data[]增量序列
32 */
33 void ShellInsert(Sqlist &L, int dk)
34 {
35     int j, i;
36     for(i = dk + 1; i<L.length; i++)
37     {
38         if (L.data[i]<L.data[i-dk])
39         {
40             L.data[0] = L.data[i];
41             for (j = i-dk; j > 0 && (L.data[0] < L.data[j]); j-=dk)
42             {
43                 L.data[j+dk] = L.data[j]; 
44             }
45             L.data[j+dk] = L.data[0];
46         }
47     }
48 }
49 
50 void ShellSort(Sqlist &L, int dlta[], int t)
51 {
52     for (int k = 0; k < t; k++)
53     {
54         ShellInsert(L,dlta[k]); //一趟增量为dlta[k]的插入排序
55     }
56 }
57 
58 
59 void DisplayList(Sqlist L)
60 {
61     for(int i = 1; i<L.length; i++)
62     {
63         printf("%d ",L.data[i]);
64     }
65 
66     printf("\n");
67 }
68 
69 int main(int argc, char const *argv[])
70 {
71     Sqlist L;
72     int a[] = {27,13,76,97,65,38,49};
73     int dlta[] = {5,3,1};                  //增量序列(增量序列中的值没有除1之外的公因子,并且最后一个增量值必须是1)
74     int t = 3; //t为排序趟数 1<=t<=log(n+1) n标识要进行排序的序列中元素的个数
75     int l = sizeof(a)/sizeof(a[1]);
76 
77     InitList(L,l);
78     CreateLList(L,a,l);
79     ShellSort(L,dlta,t);
80     DisplayList(L);
81     return 0;
82 }

 

标签:dk,int,void,length,希尔,Sqlist,增量,排序,data
来源: https://www.cnblogs.com/Ghost4C-QH/p/10630634.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有