编程语言
首页 > 编程语言> > C语言- 基础数据结构和算法 - 17 希尔排序20220618

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

作者:互联网

 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