归并排序
2015-09-09 20:49
337 查看
#include <stdio.h> #define Max 100 int min(int a, int b) { return a < b ? a : b; } void merge_array(int *array, int *new_array, int first, int last) { int mid = (first + last) / 2; int a = first; int b = mid + 1; int num = 0; while(a <= mid && b <= last) { if(array[a] < array[b]) new_array[num++] = array[a++]; else new_array[num++] = array[b++]; } while(a <= mid) new_array[num++] = array[a++]; while(b <= last) new_array[num++] = array[b++]; int i; for(i = 0; i < num; i++) array[first + i] = new_array[i]; } void merge_sort1(int *array, int *new_array, int first, int last) { if(first < last) { int mid = (first + last) / 2; merge_sort1(array, new_array, first, mid); merge_sort1(array, new_array, mid + 1, last); merge_array(array, new_array, first, last); } } void merge_sort2(int *array, int *new_array, int first, int last) { int i, k, j, m; int a, b, a_max, b_max; int num = 0; int flag = 0; for(i = 2; ; i *= 2) { if(flag) break; if(i >= (last - first + 1)) flag = 1; for(k = first; k <= last; k += i) { a = k; b = k + (i - 1) / 2 + 1; a_max = min(k + (i - 1) / 2, last); b_max = min(k + i - 1, last); num = 0; while(a <= a_max && b <= b_max) if(array[a] < array[b]) new_array[num++] = array[a++]; else new_array[num++] = array[b++]; while(a <= a_max) new_array[num++] = array[a++]; while(b <= b_max) new_array[num++] = array[b++]; for(m = 0; m < num; m++) array[k + m] = new_array[m]; } } } int main() { int array[Max]; int new_array[Max]; int i, n; scanf("%d", &n); for(i = 0; i < n; i++) scanf("%d", &array[i]); merge_sort2(array, new_array, 0, n - 1); for(i = 0; i < n; i++) printf("%d ", new_array[i]); printf("\n"); return 0; }
相关文章推荐
- Android属性动画(http://developer.android.com/guide/topics/graphics/prop-animation.html)
- iOS程序启动过程
- Spark on Yarn+Hbase环境搭建指南(三)Spark安装
- 主项定理Master Method 计算时间复杂度
- Android开发:在onTouchEvent中处理任意时间的长按事件
- 02.Jquery Mobile介绍以及Jquery Mobile页面与对话框
- SGU103 The traffic lights 绞脑题
- java 环境变量设置 经典啊 很详细
- HDU - 1233 还是畅通工程(最小生成树模板题)
- 国科:做一家有梦想的芯片企业 五年后年收入100亿---C114
- java读取网页
- 数据库访问性能优化
- hibernate中one-to-one两种配置方式
- 快速排序
- C语言去掉字符串前后空格,中间多余空格
- centos7在VMware下配置网络连接
- bootstrap笔记第一天
- 算法导论——动态规划之最长公共子序列(LCS)和最长回文子序列(LPS)
- POJ - 1287 Networking(最小生成树模板题)
- 为什么解析 array_column不可用,