ICode9

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

C语言- 基础数据结构和算法 - 19 归并排序20220618

2022-06-18 19:35:08  阅读:157  来源: 互联网

标签:arr end temp 20220618 19 MAX C语言 int start


 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

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

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

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

ICode9版权所有