【Algorithm】自顶向下的归并排序
一. 算法描述
自顶向下的归并排序:采用分治法进行自顶向下的程序设计方式,分治法的核心思想就是分解、求解、合并。
- 先将长度为N的无序序列分割平均分割为两段
- 然后分别对前半段进行归并排序、后半段进行归并排序
- 最后再将排序好的前半段和后半段归并
过程(2)中进行递归求解,最终下图详细的分解了自顶向下的合并算法的实现过程:
二. 算法实现
/*=============================================================================
#
# FileName: mergeSort.c
# Algorithm: 归并排序(自顶向下)
# Author: Knife
# Created: 2014-06-14 16:40:02
#
=============================================================================*/
#include<stdio.h>
#include<stdlib.h>
void merge_sort(int* intArr, int intArr_len);
void merge_array(int* intArr1, int len1, int* intArr2, int len2); void main(){
int intArr[] = {,,,,,,,,,};
int n = sizeof (intArr) / sizeof (intArr[]);
int i = ;
merge_sort(intArr, n);
for(;i<n;i++){
printf("%d ",intArr[i]);
}
printf("\n"); } //归并排序(自顶向下)
void merge_sort(int* intArr, int intArr_len){
if(intArr_len > ){
int* intArr1 = intArr;
int intArr1_len = intArr_len/;
int* intArr2 = intArr + intArr_len/;
int intArr2_len = intArr_len - intArr1_len; //分别归并排序
merge_sort(intArr1,intArr1_len);
merge_sort(intArr2,intArr2_len); //排序
merge_array(intArr1, intArr1_len, intArr2, intArr2_len); }
} //合并两个数组,并排序
void merge_array(int* intArr1, int len1, int* intArr2, int len2){
//申请分配空间
int* list = (int*) malloc((len1+len2) * sizeof (int));
int i = , j = , k = ;
while(i < len1 && j < len2){
// 把较小的那个数据放到结果数组里, 同时移动指针
list[k++] = (intArr1[i] < intArr2[j]) ? intArr1[i++] : intArr2[j++];
}
// 如果 intArr1 还有元素,把剩下的数据直接放到结果数组
while(i < len1){
list[k++] = intArr1[i++];
}
// 如果 intArr2 还有元素,把剩下的数据直接放到结果数组
while(j < len2){
list[k++] = intArr2[j++];
}
// 把结果数组 copy 到 intArr1 里
for(i = ; i < k; i++){
intArr1[i] = list[i];
}
//释放申请的空间
free(list);
}
三. 算法分析
- 平均时间复杂度:O(nlog2n)
- 空间复杂度:O(n) (用于存储有序子序列合并后有序序列)
- 稳定性:稳定
参考资料
[1] http://blog.csdn.net/cjf_iceking/article/details/7920153
[2] http://blog.chinaunix.net/uid-21827145-id-1814449.htm
[3] http://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F
【Algorithm】自顶向下的归并排序的更多相关文章
- 自顶向下归并排序(Merge Sort)
一.自顶向下的归并排序思路: 1.先把数组分为两个部分. 2.分别对这两个部分进行排序. 3.排序完之后,将这两个数组归并为一个有序的数组. 重复1-3步骤,直到数组的大小为1,则直接返回. 这个思路 ...
- 自顶向下(递归)的归并排序和自底向上(循环)的归并排序——java实现
归并排序有两种实现方式,自顶向下和自底向上.前者的思想是分治法,现将数组逐级二分再二分,分到最小的两个元素后,逐级往上归并,故其核心在于归并.后者的思想相反,采用循环的方式将小问题不断的壮大,最后变成 ...
- 归并排序算法(C#实现)
归并排序(Merge Sort)是利用"归并"技术来进行排序.归并是指将若干个已排序的子文件合并成一个有序的文件.归并排序有两种方式:1): 自底向上的方法 2):自顶向下的方法 ...
- 归并排序Java实现
package practice; import edu.princeton.cs.algs4.*; /* * 归并排序 * 时间复杂度O(NlgN) N为数组长度 * 归并排序在小数组上表现并不好可 ...
- C#版 - LeetCode 148. Sort List 解题报告(归并排序小结)
leetcode 148. Sort List 提交网址: https://leetcode.com/problems/sort-list/ Total Accepted: 68702 Total ...
- 数据结构和算法(Golang实现)(23)排序算法-归并排序
归并排序 归并排序是一种分治策略的排序算法.它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列. 归并排序首先由著名的现代计算机之父John_von_ ...
- ZT 9种排序
9种排序 2012-09-19 14:58 66人阅读 评论(0) 收藏 编辑 删除 algorithmfpfilemergeintegerfloat [cpp] view plaincopy #in ...
- 常用算法之排序(Java)
一.常用算法(Java实现) 1.选择排序(初级算法) 原理:有N个数据则外循环就遍历N次并进行N次交换.内循环实现将外循环当前的索引i元素与索引大于i的所有元素进行比较找到最小元素索引,然后外循环进 ...
- 排序算法 -- 数据结构与算法的javascript描述 第12章
排序是常见的功能,给定一组数据,对其进行排序. 在此之前,我们需要准备个基础工作--自动生成数组,并可以对该组数据做任何处理. /** * 测试类 ,数组 * @param numElements * ...
随机推荐
- Hdfs dfs命令使用
如果是把数据放在了hdfs系统,那么我们如何访问他们呢? 1.hdfs查看文件夹 ./hdfs dfs -ls hdfs://mycluster/output/online/ 2.hdfs创建目录df ...
- python 不需要函数重载
函数重载主要是为了解决两个问题. 可变参数类型. 可变参数个数. 另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其 ...
- JPA的配置文件
一.引入包 <dependencies> <!-- https://mvnrepository.com/artifact/org.hibernate.javax.persistenc ...
- 获取请求真实ip
/** * Copyright (c) 2011-2014, James Zhan 詹波 (jfinal@126.com). * * Licensed under the Apache License ...
- ssi框架搭建
Struts2主要来源于webwork框架,与Struts1相比,在数据传递方面,Struts2提供了更加强大OGNL标签功能,使其能够通过在action中定义变量来直接与jsp页面中的数据进行相互传 ...
- 写出3个使用this的典型应用
(1).在html元素事件属性中使用,如: <input type=”button” onclick=”showInfo(this);” value=”点击一下” /> (2).构造函数 ...
- H5 新增内容 新增属性
1.视频 video 2.音频 audio 3.拖放 Drag 和 drop 4.画布 canvas 5.SVG 6.地理定位 navigator.geolocation.getCurrentPosi ...
- CentOS6.x 图形界面(gnome)安装
CentOS6默认的安装选项 Desktop :基本的桌面系统,包括常用的桌面软件,如文档查看工具. Minimal Desktop :基本的桌面系统,包含的软件更少. Minimal :基本的系统, ...
- .NET/ASP.NET/C#/WCF/SQL Server/My SQL/Java/JSP/JDBC/Spring/Spring MVC/PHP/Python/Ruby/Shell/Agile/CSS/HTML/HTTP/Unix/Linux大量PDF书籍/电子书籍下载, Effective Java 下载
223本电子书籍,囊括了.NET/ASP.NET/C#/WCF/SQL Server/My SQL/Java/JSP/JDBC/Spring/Spring MVC/PHP/Python/Shell/A ...
- 写了一个简单的Linux Shell用来下载文件
#!/bin/sh ; i<; i=i+ )); do # 利用spider来探测请求的资源是否存在,并把请求的结果写入到一个文件 wget --spider --http-user=usern ...