C语言- 基础数据结构和算法 - 19 归并排序20220618
作者:互联网
C语言- 基础数据结构和算法 - 19 归并排序20220618.
听黑马程序员教程《基础数据结构和算法 (C版本)》,
照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1
喜欢的朋友可以去看看,欢迎大家一起交流学习。
19 归并排序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 需要额外的空间(内存),空间换时间。 10 11 */ 12 13 #define MAX 1000000 14 15 // 取得当前系统时间 16 long getSystemTime(){ 17 struct timeb tb; 18 ftime(&tb); 19 return tb.time*1000 + tb.millitm; 20 } 21 22 // 创建数组 23 int* CreateArray(){ 24 int i; 25 int* arr = (int*)malloc(sizeof(int) * MAX); 26 srand((unsigned int)time(NULL)); 27 for(i=0;i<MAX;i++){ 28 arr[i] = rand() % MAX; 29 } 30 31 return arr; 32 } 33 34 // 打印函数 35 void PrintArray(int arr[],int lenght){ 36 37 int i; 38 for(i=0;i<lenght;i++){ 39 printf("%-3d ",arr[i]); 40 } 41 printf("\n-------------------------------------------------\n"); 42 } 43 44 // 归并排序的合并算法 从小到大 45 void Merge(int arr[],int start,int end,int mid,int* temp){ 46 int i_start = start; 47 int i_end = mid; 48 int j_start = mid +1; 49 int j_end = end; 50 int lenght = 0; //辅助空间temp里元素个数。 51 52 // 合并两个有序序列 53 while(i_start <= i_end && j_start <= j_end){ 54 if(arr[i_start] < arr[j_start]){ 55 temp[lenght] = arr[i_start]; 56 lenght ++ ; 57 i_start ++; 58 } else { 59 temp[lenght] = arr[j_start]; 60 j_start ++; 61 lenght ++; 62 } 63 64 } 65 66 // i 这个序列 67 while(i_start <= i_end){ 68 temp[lenght] = arr[i_start]; 69 i_start ++; 70 lenght ++; 71 } 72 // j 这个序列 73 while(j_start<=j_end){ 74 temp[lenght] = arr[j_start]; 75 j_start ++; 76 lenght ++; 77 78 } 79 // 辅助空间的数据覆盖到原空间 80 int i; 81 for(i = 0;i<lenght;i++){ 82 arr[start+i] = temp[i]; 83 } 84 85 } 86 // 归并排序 从小到大 87 void MetgeSort(int arr[],int start,int end,int* temp){ 88 89 if(start >= end){ 90 return; 91 } 92 // 分两组 93 int mid = (start + end) / 2; 94 // 递归 分组 左半边 95 MetgeSort(arr,start,mid,temp); 96 // 右半边 97 MetgeSort(arr,mid+1,end,temp); 98 99 // 合并 100 Merge(arr,start,end,mid,temp); 101 102 103 104 } 105 // 快速排序(从小到大) 106 void QuickSort(int arr[],int start,int end){ 107 108 int i = start; 109 int j = end; 110 111 // 基准数。所有的数都与基准数进行比较。 112 int temp = arr[start]; 113 114 if(i<j){ 115 while(i<j){ 116 117 // 从右向左去找比基准数小的元素。 118 while(i<j && arr[j]>=temp){ 119 j--; 120 } 121 122 // 填坑 123 if(i<j){ 124 arr[i] = arr[j]; 125 i++; 126 } 127 128 // 从左向右,找双基准数大的数 129 while( i<j && arr[i]< temp){ 130 i++; 131 } 132 133 // 填坑 134 if(i<j){ 135 arr[j] = arr[i]; 136 j--; 137 } 138 } 139 140 // 把基准数放到i或j(i已经等于j了)的位置 141 arr[i] = temp; 142 143 // 递归 对基准数左半部分进行快速排序 144 QuickSort(arr,start,i-1); 145 // 递归,对右半部分进行快速排序 146 QuickSort(arr,i+1,end); 147 148 } 149 } 150 151 // 希尔排序(从小到大) 152 void ShellSort(int arr[],int lenght){ 153 154 // 分组的增量(分多少个组),先默认为lenght; 155 int increaerment = lenght; 156 157 int i,j,k; 158 do{ 159 // 确定分组的增量 160 increaerment = increaerment / 3 + 1 ; 161 162 for(i=0;i<increaerment;i++){ 163 164 for(j=i+increaerment;j<lenght;j+=increaerment){ 165 166 if(arr[j] < arr[j-increaerment]) { 167 168 int temp = arr[j]; 169 for(k=j-increaerment;k>=0 && temp < arr[k];k-=increaerment){ 170 arr[k+increaerment] = arr[k]; 171 } 172 arr[k+increaerment] = temp; 173 } 174 } 175 } 176 177 } while(increaerment > 1); // 先执行上面的do,然后再判断,符合条件再继续执行。 178 } 179 180 int main(){ 181 printf("好好学习,天天向上~!!\t\t\t 19 归并排序20220618\n\n"); 182 183 // 创建数组 184 int* myArr = CreateArray(); 185 186 //printf("原数组:"); 187 //PrintArray(myArr,MAX); 188 189 //printf("排序后:"); 190 // 辅助空间 191 int* temp = (int*)malloc(sizeof(int) * MAX); 192 long t_start = getSystemTime(); 193 //MetgeSort(myArr,0,MAX-1,temp); 194 //QuickSort(myArr,0,MAX-1); 195 ShellSort(myArr,MAX); 196 197 long t_end = getSystemTime(); 198 //PrintArray(myArr,MAX); 199 printf("排序%d个元素所需时间(毫秒):%ld \n",MAX,t_end-t_start); 200 201 202 203 204 // 释放空间 205 free(temp); 206 free(myArr); 207 printf("\n"); 208 system("pause"); 209 return 0; 210 }
标签:arr,end,temp,20220618,19,MAX,C语言,int,start 来源: https://www.cnblogs.com/stou/p/16389052.html