排序算法——归并排序
2016-07-12 12:38
281 查看
算法描述
归并排序使用递归分治的思想,先递归划分子问题,然后合并结果。假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的有序列表:再两两归并,…….,重复,直到得到一个长度为n的有序序列具体步骤如下:
将所要进行排序的序列分为左右两部分,将要排序的序列起始元素下标赋给left, 最后一个元素下标赋给right
将上面所得的两部分序列继续按照步骤1进行划分,直到划分的区间长度为1
将划分结束后的序列进行归并排序,排序的方法为对所分的n个子序列进行两两合并,直到得到1个长度为n的有序序列
算法分析
空间复杂度:O(n)时间复杂度:O(nlogn)
/*C语言实现*/ void merge(int arr[], int left, int mid, int right) { int i = left, j = mid + 1, k = 0; //分配存储空间,用于存储合并后的数组 int *tmp = (int *)malloc(sizeof(int) * (right - left + 1))); assert(tmp); /*合并两个子序列*/ while(i <= mid && j <= right) { if(a[i] < a[j]) { tmp[k] = a[i]; k++; i++; } else { tmp[k++] = a[j++]; k++; j++; } } /*将其中一个剩余数据复制到临时数组*/ while(i <= mid) { tmp[k] = a[i++]; k++; i++; } while(j <= right) { tmp[k] = a[j]; k++; j++; } /**/ for(k = 0, i = left; i <= right; i++, k++) { a[i] = tmp[k]; } free(tmp); return; } void mergesort(int a[], int left, int right) { int mid = 0; if(left < right) //当左边小于右边,继续执行递归操作 { mid = (left + right) / 2 mergesort(a, left, mid); mergesort(a, mid + 1, right); merge(a, left, mid, right); } else return; /*递归终止*/ }
相关文章推荐
- JavaScript演示排序算法
- C#递归算法之分而治之策略
- 有关数据库SQL递归查询在不同数据库中的实现方法
- C#中的递归APS和CPS模式详解
- WinForm实现按名称递归查找控件的方法
- C#递归方法实现无限级分类显示效果实例
- 使用SqlServer CTE递归查询处理树、图和层次结构
- C#递归算法之打靶算法分析
- C#中的尾递归与Continuation详解
- 算法之排序算法的算法思想和使用场景总结
- C#递归实现显示文件夹及所有文件并计算其大小的方法
- php递归创建目录的方法
- PHP版本常用的排序算法汇总
- PHP递归创建多级目录
- JavaScript实现多种排序算法
- Javascript递归打印Document层次关系实例分析
- C#递归算法寻找数组中第K大的数
- C++使用递归方法求n阶勒让德多项式完整实例
- 举例讲解C语言对归并排序算法的基础使用
- C#用递归算法解决经典背包问题