基于分治算法的归并排序
2016-07-13 18:44
155 查看
#include <stdio.h> #include <math.h> void main() { int array[] = {1,212,35,1,456,12376,167,12,7523,71,634}; mergeSort(array, 0, 10); for(int i = 0; i < 11; i++ ) { printf("%d\n", array[i]); } } void mergeSort(int* array, int start, int end) { //start end 均为索引 if(start < end) { int middle = ceil((start + end)/2); mergeSort(array, start, middle); mergeSort(array, middle + 1, end); merge(array, start, middle, end); } } void merge(int* array, int start, int middle, int end){ //start middle end 均为索引 int leftLength = middle - start + 1; int rightLength = end - middle ; int* left = (int*)malloc(sizeof(int) * leftLength); int* right = (int*)malloc(sizeof(int) * rightLength); int i = 0; int j = 0; int leftStart = start; int rightStart = middle + 1; for(; i < leftLength ; i++) { left[i] = array[leftStart]; ++leftStart; } for(; j < rightLength ; j++) { right[j] = array[rightStart]; ++rightStart; } i=0; j=0; for(int n = start; n <= end; n++ ) { if((i<leftLength && left[i] <= right[j]) || j>=rightLength ) { array = left[i]; i++; } else if((j<rightLength && right[j] <= left[i]) || i>=leftLength) { array = right[j]; j++; } } free(left); free(right); } //C 新手,多多包涵
分治算法的三个基本为:
1. 如果问题可分解,则分解成N个问题, 每个小问题都是总问题的一个小规模实例
2. 求解小问题
3. 合并解,组成问题最终解。
//TODO 写出分析过程
相关文章推荐
- MySQL利用frm和idb文件进行数据恢复
- 生成模型、判别模型
- z一个带横线 内容居中的布局
- epoll实现分析
- linux的定时任务
- java网络socket编程(三)之ServerSocket服务器端
- log4j.properties配置详解与实例-全部测试通过
- Java String
- 通过源码分析Android 的消息处理机制
- 给游戏开发者和程序员的10个建议:如何平衡工作与生活
- java对cookie的操作
- Ubuntu12.04安装NVIDIA显卡驱动
- Nginx+php-fpm 502 504问题
- epoll poll select
- 第四章 虚拟机性能监控与故障处理
- 优雅编程之这样格式代码,你就"正常了"!
- Vmware安装Centos NAT方式设置静态IP
- C二叉树的基本操作---创建、遍历、求深度、求叶子结点
- 创业维艰 读书笔记
- PHP 7.0 新特性