关于 merge sort
来源:互联网 发布:dbstar控制卡软件 编辑:程序博客网 时间:2024/06/10 21:40
继quick sort后的第二个排序,merge sort,依然是分治的思想,将原数组分成若干个小数组,排序,然后再慢慢合并成大数组。
实现代码:
#include<stdio.h>#include<stdlib.h>#include<time.h>void merge(int a[], int b[], int lst, int rst, int re){int i, le, nums, tmp;le = rst - 1;tmp = lst;nums = re - lst + 1;while(lst <= le && rst <= re)//比较复制到临时表中 if(a[lst] >= a[rst])b[tmp++] = a[lst++];elseb[tmp++] = a[rst++];while(lst <= le)//将未完成的复制完成 b[tmp++] = a[lst++];while(rst <= re)b[tmp++] = a[rst++];for(int i = 0; i < nums; i++, re--)//将临时数组中的内容拷贝回去 注意b中的顺序是和最后数组的顺序相反的a[re] = b[re];}void Msort(int a[], int b[], int left, int right){int center;if(left < right){center = (left + right) / 2;Msort(a, b, left, center);//依然是分治的思想,类似快排 Msort(a, b, center + 1, right);merge(a, b, left, center + 1, right);}}void Mergesort(int a[], int n)//对大数据处理时常常要考虑到内存分配问题,所以要通过动态内存分配的方法来优化程序 {int *tmp;tmp = (int *) malloc(sizeof(int) * n);if(tmp){Msort(a, tmp, 0, n - 1); free(tmp);//每次归并排序时都只需要一个临时内存空间来协助排序,所以当排序结束后可以将其释放 }elseputs("Error! No free ram left!");} main(){int nums[100];srand(time(NULL));for(int i = 0; i < 100; i++)nums[i] = rand() % 100;for(int i = 0; i < 100; i++)printf("%d ", nums[i]);puts("\n-----------------------------------------------");Mergesort(nums, 100);for(int i = 0; i < 100; i++)printf("%d ", nums[i]);}poj 2299:http://poj.org/problem?id=2299
本题是merge sort的经典题目,因为merge sort也是通过小数组的两两比较来排序的,和bubble很像,所以虽然本题可以用bubble得出正确答案,但超时是无疑的。
解题思路:计算每次排序后数字位置的变化量,将其累加。
AC代码:
#include<stdio.h>#include<stdlib.h>long long count;void merge(int a[], int tmp[], int s, int m, int e){int ok = 0;int f = m - 1, k = s, n = e - s + 1, inis = s;while(s <= f && m <= e){if(a[s] <= a[m])//临时数组tmp和原数组a是相同排序方式{tmp[k++] = a[s++];}else{count += abs(k - m);//只有当后面数列的数大于前面数列的数时才会互换,互换次数=abs(当前位-原位)tmp[k++] = a[m++];}}while(s <= f)tmp[k++] = a[s++];while(m <= e)tmp[k++] = a[m++];for(int i = 0; i < n; i++)//为了使tmp复制到a上,特意设置了inis变量a[i + inis] = tmp[i+ inis];}void Msort(int a[], int tmp[], int s, int e){int mid;if(s < e){mid = (s + e) / 2;Msort(a, tmp, s, mid);Msort(a, tmp, mid + 1, e);merge(a, tmp, s, mid + 1, e);}}void MergeSort(int a[], int n){int *tmp;tmp = (int *) malloc(sizeof(int) * n);if(tmp){Msort(a, tmp, 0, n - 1);free(tmp);}}main(){int n;int *nums;while(scanf("%d", &n) && n){count = 0;nums = (int *) malloc(sizeof(int) * n);for(int i = 0; i < n; i++)scanf("%d", &nums[i]);MergeSort(nums, n);printf("%lld\n", count);}}
0 0
- 关于 merge sort
- Merge Sort
- Merge sort
- merge sort
- merge sort
- merge sort
- Merge Sort
- merge sort
- Merge Sort
- Merge Sort
- merge sort
- Merge Sort
- Merge sort
- Merge-sort
- Merge Sort
- Merge sort
- Merge Sort
- Merge-Sort
- 博客之星投票结束,我的经历
- iOS常用地址保存
- 让数据库变快的10个建议
- 关于archlinux2013-12、2014-1安装错误
- Java设计模式泛型化之单例模式
- 关于 merge sort
- 微信支付类目及费率
- mysql相关错误以及对应解决方法总结
- 单机上安装、配置MPI并行环境(Linux版)
- UVA 11269 - Setting Problems(贪心)
- CodeForces 375A
- android 手机超频降频秘籍
- Oracle系统包dbms_random
- 保存 log 到手机内存的代码