合并排序
来源:互联网 发布:sql语句学生信息 编辑:程序博客网 时间:2024/06/05 02:18
思想:二分法,类似于二叉树的形式,不断的拆分,知道每个部分的个数为1,然后返回到根元素,进行排序。
#include <stdio.h>//合并子序列void merge(int array[], int start, int mid, int end){int len_l = mid - start + 1; // 左子串长度int len_r = end - mid;//右子串长度int len = 0, len_max = 0;//len:两个字串小值,len_max:两子串长度之和int l = start, r = mid + 1;//l:左子串遍历,r:右子串遍历int m = 0;//局部变量数组索引//获取两个子串较小值if(len_l > len_r){len = len_r;}else{len = len_l;}len_max = end - start + 1;int array_t[len_max];for(m = 0; len_r != 0 && len_l != 0; m++){//取两子串的小值保存if(array[l] < array[r]){array_t[m] = array[l];l++;len_l--;}else{array_t[m] = array[r];r++;len_r--;}}//其中一条子串为0,则需要将另一条子串的剩余部分连接到局部数组中if(len_l == 0){while(len_r){array_t[m++] = array[r++];len_r--;}}else if(len_r == 0){while(len_l){array_t[m++] = array[l++];len_l--;}}//将局部数组的值拷贝到原数组for(m = 0; m < len_max; m++){array[start + m] = array_t[m];}}//拆分子序列void split(int array[], int start, int end){int i = 0, j = 0;int mid;if(start == end){return;}else{mid = start + (end - start) / 2;//拆分成两条子串split(array, start, mid); split(array, mid + 1, end);//按顺序合并merge(array, start, mid, end);}return;}int main(){int array[8] = {3, 41, 52, 26, 38, 57, 9, 49};split(array, 0, 7);int i = 0;for(i = 0; i < 8; i++){printf("%d ", array[i]);}printf("\n");}
0 0
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 合并排序
- 网易游戏2015 在线笔试题(2)
- Redis --- 排序SORT
- NSDateFormatter 'YYYY' 和 'yyyy' 的区别
- linux中shell变量$#,$@,$0,$1,$2的含义解释
- linux下启动mysql以及设置远程访问
- 合并排序
- SSH Secure Shell Client中文乱码的解决方法
- samba服务器的安装
- 如何在 Ubuntu 15.04 系统中安装 Logwatch
- 构造函数中成员变量初始化顺序问题
- Swift中的NSKeyedArchiver使用
- web前端,html+css常用元素,属性总结
- [letecode java] Convert Sorted Array to Binary Search Tree
- Struts2中访问web元素的四种方式及前台jsp页面获取后台值的方式