分治法之归并排序
2015-11-10 22:20
232 查看
/************************************************* 分治法之归并排序:时间复杂度为O(nlgn) 升序排列。 分治法的三部曲: 1:分解; 2:解决; 3:合并; **************************************************/ #include <stdio.h> #include <stdlib.h> //合并函数 void merge(int *A,int low,int mid,int high) { int n1=mid-low+1;//左半部分的数组长度 int n2=high-mid;//右半部份的数组长度 int *left=new int[n1]; int *right=new int[n2]; //记录左半部分的数组元素 for(int i=0;i<n1;i++) { left[i]=A[low+i]; } //记录右半部份的数组元素 for(int i=0;i<n2;i++) { right[i]=A[mid+1+i]; } //将左半部分元素依次和右半部份元素比较, //每次取出最小的放回原数组,实现排序 for(int i=0,j=0,k=low;k<=high;) { if(left[i]<=right[j]) { A[k]=left[i]; i++; k++; } else { A[k]=right[j]; j++; k++; } } } //归并排序(递归函数) void merge_sort(int *A,int low,int high) { if(low<high) { int mid=(low+high)/2; merge_sort(A,low,mid); merge_sort(A,mid+1,high); merge(A,low,mid,high); } } int main() { int temp,length,*A; while(scanf("%d",&length)==1) { if(length!=0) { //输入数组元素 A=new int[length]; for(int i=0;i<length;i++) { scanf("%d",&A[i]); } /*归并排序算法核心********************************/ merge_sort(A,0,length-1); /***************************************************/ //输出已排序数组 for(int i=0;i<length;i++) { printf("%d ",A[i]); } } else break; } return 0; }
相关文章推荐
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法
- C语言泛型编程实例教程
- C语言中使用lex统计文本文件字符数
- 在C语言中转换时间的基本方法介绍