解题思路:看视频学的,那个视频真的超级详细,视频地址我放下面了。
教学视频:https://www.bilibili.com/video/BV1Pt4y197VZ?from=search&seid=15030035287471509854&spm_id_from=333.337.0.0
参考代码:
#include <stdio.h> #include <stdlib.h> void MergeSort(int arr[], int tempArr[], int left, int right); void Msort(int arr[], int n); void Merge(int arr[], int tempArr[], int left, int middle, int right); int main() { int n; scanf("%d", &n); int arr[n]; for (int i = 0; i < n;i++) { scanf("%d", &arr[i]); } Msort(arr, n); for (int i = 0; i < n;i++) { printf("%d ", arr[i]); } printf("\n"); return 0; } void Msort(int arr[], int n) { int *tempArr=(int*)malloc(n* sizeof(int)); if(tempArr) { MergeSort(arr,tempArr, 0, n-1); free(tempArr); } else { printf("error:failed to allocate memory"); } } void MergeSort(int arr[], int tempArr[], int left, int right) { if(left<right) { int middle=left+(right-left)/2; MergeSort(arr,tempArr,left,middle); MergeSort(arr,tempArr,middle+1,right); Merge(arr,tempArr,left,middle,right); } } void Merge(int arr[], int tempArr[], int left, int middle, int right) { int l_pos=left; int r_pos=middle+1; int pos=left; while(l_pos<=middle&&r_pos<=right) { if(arr[l_pos]<arr[r_pos]) { tempArr[pos++]=arr[l_pos++]; } else { tempArr[pos++]=arr[r_pos++]; } } while(l_pos<=middle) { tempArr[pos++]=arr[l_pos++]; } while(r_pos<=right) { tempArr[pos++]=arr[r_pos++]; } while(left<=right) { arr[left]=tempArr[left]; left++; } }
0.0分
1 人评分
C语言训练-角谷猜想 (C++代码)(3N+1问题)浏览:1751 |
Hello, world! (C语言代码)浏览:1202 |
【回文数(二)】 (C语言代码)浏览:731 |
【计算两点间的距离】 (C语言代码)浏览:884 |
不容易系列 (C语言代码)浏览:669 |
校门外的树 (C语言代码)浏览:961 |
简单的a+b (C语言代码)浏览:340 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:514 |
C二级辅导-等差数列 (C语言代码)浏览:695 |
第三届阿里中间件性能挑战赛-总决赛亚军比赛攻略浏览:1145 |