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