归并排序

归并排序的思想是将数组分成两部分,分别进行排序,然后归并起来。归并方法将数组中两个已经排序的部分归并成一个。

自顶向下归并排序

因为每次都将问题对半分成两个子问题,而这种对半分的算法复杂度一般为 O(NlogN),因此该归并排序方法的时间复杂度也为 O(NlogN)。

小数组的递归操作会过于频繁,可以在数组过小时切换到插入排序来提高性能。

自底向上归并排序

先归并那些微型数组,然后成对归并得到的子数组。

#include<stdio.h>
#include<stdlib.h>#define min(a,b) a<b?a:bchar tmp[] = {};/*字符串长度*/
int length(char *in)
{int i=0;while(in[i] != '\0')i++;return i;
}
/*输出字符串*/
void showString(char *str)
{int N = length(str);int i=0;while(i<N){printf("%c ",str[i]);i++;}printf("\n");
}
/*归并方法*/
void merge(char *str, int low, int mid, int height)
{int i = low, j = mid + 1;int k;for(k=low;k<=height;k++){tmp[k] = str[k];}for(k=low;k<=height;k++){if(i>mid)str[k] = tmp[j++];else if(j>height)str[k] = tmp[i++];else if(tmp[i] <= str[j])str[k] = tmp[i++];else str[k] = tmp[j++];}showString(str);
}
/*从顶到下的归并排序*/
void tdSort(char *str, int low, int height)
{if(height<=low)return;int mid = low + (height - low)/2;tdSort(str, low, mid);tdSort(str, mid+1, height);merge(str, low, mid, height);
}
/*从底到上的归并排序*/
void buSort(char *str)
{int N = length(str);int sz, lo;for (sz = 1; sz < N; sz += sz) {for (lo = 0; lo < N - sz; lo += sz + sz) {merge(str, lo, lo + sz - 1, min(lo + sz + sz - 1, N - 1));}}
}
int main(int argc, char **argv)
{char str[] = "bcefad";showString(str);tdSort(str, 0, length(str)-1);//buSort(str);showString(str);return 1;
}

以下Java代码转自:https://github.com/CyC2018/Interview-Notebook/

/*** Merge Sort* https://github.com/CyC2018/Interview-Notebook/*/
public class MergeSort {private int[] aux;/*** Merge归并*/private void merge(int[] a, int lo, int mid, int hi) {int i = lo, j = mid + 1;for (int k = lo; k <= hi; k++) {aux[k] = a[k]; // copy data to tmp array}for (int k = lo; k <= hi; k++) {if (i > mid) a[k] = aux[j++];else if (j > hi) a[k] = aux[i++];else if (aux[i]<=a[j]) a[k] = aux[i++]; // for stableelse a[k] = aux[j++];}}/*** Top-down merge sort自顶向下并归排序*/public void tdsort(int[] a) {aux = new int[a.length];tdsort(a, 0, a.length - 1);}private void tdsort(int[] a, int lo, int hi) {aux = new int[a.length];if (hi <= lo) return;int mid = lo + (hi - lo) / 2;tdsort(a, lo, mid);tdsort(a, mid + 1, hi);merge(a, lo, mid, hi);}/*** Bottom up merge sort自底向上并归排序*/public void busort(int[] a) {int N = a.length;aux = new int[N];for (int sz = 1; sz < N; sz += sz) {for (int lo = 0; lo < N - sz; lo += sz + sz) {merge(a, lo, lo + sz - 1, Math.min(lo + sz + sz - 1, N - 1));}}}public void show(int[] a){int N = a.length;for(int i=0;i<N;i++){System.out.print(a[i]+" ");}System.out.println();}static public void main(String[]args){int a[] = {5,4,3,2,1};MergeSort ms = new MergeSort();ms.show(a);ms.tdsort(a);ms.show(a);}
}

排序算法:归并排序(C、Java)相关推荐

  1. java 奇偶数据排序算法,简单讲解奇偶排序算法及在Java数组中的实现

    简单讲解奇偶排序算法及在Java数组中的实现 奇偶排序是一个比较有个性的排序,基本思路是奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序 举例吧, 待排数组 [6 2 4 1 5 9] ...

  2. 排序算法总结和java实现

    排序算法总结和java实现 0.排序算法说明 0.1 排序的定义 0.2 术语说明 0.3 算法总结 0.4 算法分类 0.5 比较和非比较的区别 1.冒泡排序 1.1 算法描述 1.2 动图演示 1 ...

  3. 选择排序算法(基于Java实现)

    title: 选择排序算法(基于Java实现) tags: 选择算法 选择排序算法原理及代码实现: 一.选择排序算法的原理 选择排序算法的实现思路有点类似插入排序,也分已排序区间和未排序区间.但是选择 ...

  4. 桶排序算法(基于Java实现)

    title: 桶排序算法(基于Java实现) tags: 桶排序算法 桶排序算法的原理和代码实现 一.桶排序算法的原理 桶排序,顾名思义,会用到"桶",核心思想是将要排序的数据分到 ...

  5. 插入排序算法 java_排序算法实现-插入排序(Java版本)

    原标题:排序算法实现-插入排序(Java版本) 插入排序(英语:Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到 ...

  6. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 ...

  7. python排序算法——归并排序(附代码)

    python排序算法 --归并排序 文章目录 python排序算法 --归并排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序 ...

  8. 十大经典排序算法-归并排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  9. 【转】排序算法复习(Java实现) (二): 归并排序,堆排序,桶式排序,基数排序...

    http://www.blogjava.net/javacap/archive/2007/12/14/167618.html 六 归并排序 算法思想是每次把待排序列分成两部分,分别对这两部分递归地用归 ...

  10. java中的排序算法——归并排序

    为什么使用归并排序? java中的Arrays.sort(Object[] o)是对数组进行排序,它使用的是归并排序的方式,  快速排序要比归并排序更快一些,但为什么使用归并排序了?原因是归并排序是一 ...

最新文章

  1. matplotlib散点图点大小_一步步学Matplotlib炫酷可视化(上)
  2. 通过自定义ISAPI Filter来禁止敏感文件的访问
  3. Jackson 注解 -- 自定义输出格式
  4. make zImage和make uImage的区别和mkimage工具的使用
  5. 电脑怎么重置host_电脑又双叒叕卡顿?究竟要“重装”还是“重置”?原来这区别大了...
  6. LeetCode 题 - 69. x 的平方根 python解法
  7. 聊斋java_Deferred,一种Java异步管理机制
  8. Hybird开发之webview
  9. Altium designer快速查找PCB中的元器件
  10. C语言文本输入中文乱码问题
  11. RH8搭建静态网站——基于https协议的静态网站(综合练习)
  12. be 动词 、 一般动词的过去式
  13. Python OpenCV 将同心圆环填充为实心圆
  14. 戴尔3040计算机没有VGA接口,电脑没有vga接口怎么办
  15. PAT乙级题目索引(题目+解析+AC代码)
  16. Java游戏开发框架LGame-0 2 8版发布(含JavaSE及Android版,已有文档)
  17. 跳出“套路”泥沼,让在线教育回归本心
  18. 2017-2018-1 20155222 《信息安全系统设计基础》第13周学习总结
  19. 信大第三届超越杯团体赛 题解
  20. 一个合格的中级前端工程师需要掌握的技能笔记(下)

热门文章

  1. redis学习-主从复制Master/slave
  2. 【BZOJ】1015 [JSOI2008]星球大战starwar(并查集+离线处理)
  3. 原始线性结构单链表的实现以及操作
  4. react native ScrollView
  5. html 自定义标签的作用
  6. 拦截方法并替换成自己的方法
  7. html template--(来自网易)
  8. Flex4之元数据标签使用
  9. [转载]企业网站建设必知必会
  10. 项目实训第一周(车道线检测)