ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C语言- 基础数据结构和算法 - 17 希尔排序20220618

2022-06-18 19:36:15  阅读:137  来源: 互联网

标签:arr 17 20220618 int 插入排序 C语言 -- include


 C语言- 基础数据结构和算法 - 17 希尔排序20220618.

听黑马程序员教程《基础数据结构和算法 (C版本)》,

照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1

喜欢的朋友可以去看看,欢迎大家一起交流学习。

17 希尔排序20220618.c

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 #include <time.h>
  5 #include <sys/timeb.h>
  6 
  7 /*
  8     插入排序效率高的两个条件:
  9         1、元素序列基本有序的情况下;
 10         2、元素个数比较少的情况下。
 11     希尔排序就是通过【分组】的方式,模拟满足插入排序的两个条件,从而提高效率。
 12         -- 【分组】插入排序
 13         -- 先分组,然后对每组分别进行插入排序,最后得出一个基本有序的元素,
 14         -- 最后整体插入排序 
 15         -- 分组原则(分几组合适):increasement / 3 + 1 。 
 16 */ 
 17 
 18 
 19 #define MAX 50000
 20 
 21 
 22 long getSystemTime(){        // 取得当前系统时间 
 23     struct timeb tb;
 24     ftime(&tb);
 25     return tb.time*1000 + tb.millitm;
 26 }
 27 
 28 // 插入排序
 29 void InsertSort(int arr[],int lenght){
 30     
 31     int i,j;
 32     for(i=1;i<lenght;i++){
 33         
 34         if(arr[i] < arr[i-1]){
 35             int temp = arr[i];
 36             for(j=i-1;j>=0&& temp < arr[j];j--){
 37                 arr[j+1] = arr[j];
 38             }
 39             arr[j+1]= temp;
 40         }
 41     }
 42 } 
 43 // 打印函数
 44 void PrintArray(int arr[],int lenght){
 45     
 46     int i;
 47     for(i=0;i<lenght;i++){
 48         printf("%-3d ",arr[i]);
 49     }
 50     printf("\n-------------------------------------------------\n");
 51 }
 52 
 53 // 希尔排序(从小到大) 
 54 void ShellSort(int arr[],int lenght){
 55     
 56     // 分组的增量(分多少个组),先默认为lenght;
 57     int increaerment = lenght;
 58     
 59     int i,j,k; 
 60     do{
 61         // 确定分组的增量
 62         increaerment = increaerment / 3 + 1 ; 
 63         
 64         for(i=0;i<increaerment;i++){
 65             
 66             for(j=i+increaerment;j<lenght;j+=increaerment){
 67                 
 68                 if(arr[j] < arr[j-increaerment]) {
 69                     
 70                     int temp = arr[j];
 71                     for(k=j-increaerment;k>=0 && temp < arr[k];k-=increaerment){
 72                         arr[k+increaerment] = arr[k];
 73                     }
 74                     arr[k+increaerment] = temp;
 75                 }
 76             }
 77         }
 78         
 79     } while(increaerment > 1);        // 先执行上面的do,然后再判断,符合条件再继续执行。 
 80 } 
 81 
 82 int main(){
 83     printf("好好学习,天天向上~!!!\t\t\t 17 希尔排序20220618 \n\n");
 84     
 85     int arr[MAX],arr2[MAX];
 86     
 87     srand((unsigned int)time(NULL));        // 随机 
 88     
 89     int i;
 90     for(i=0;i<MAX;i++){
 91         int randNum= rand() % MAX; 
 92         arr[i] = randNum;
 93         arr2[i] = randNum;
 94     }
 95     
 96     //printf("希尔排序前: ");
 97     //PrintArray(arr,MAX);     
 98     
 99     //printf("希尔排序后: ");    
100     long tshell_start = getSystemTime();
101     ShellSort(arr,MAX);
102     long tshell_end=getSystemTime();
103     //PrintArray(arr,MAX);    
104     printf("希尔排序%d个元素所需时间(毫秒):%ld \n",MAX,tshell_end-tshell_start);
105     
106     long tinsert_start = getSystemTime();
107     InsertSort(arr2,MAX);
108     long tinsert_end=getSystemTime();
109     //PrintArray(arr,MAX);    
110     printf("插入排序%d个元素所需时间(毫秒):%ld \n",MAX,tinsert_end-tinsert_start);
111     
112     
113     printf("\n\n");
114     system("pause");
115     return 0;
116 } 

 

标签:arr,17,20220618,int,插入排序,C语言,--,include
来源: https://www.cnblogs.com/stou/p/16389045.html

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

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

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

ICode9版权所有