已知一个数组   15、58、61、75、21、32、89、4、78、83。采用递归实现的归并排序将数组有序。

分治策略:(摘自《算法导论》)

在分治策略中,我们采用递归解决问题

分解:将原问题分解为子问题,子问题与原问题一样,只不过规模更小。

解决:递归的求解子问题,如果子问题足够小,则停止递归,直接解决子问题。

合并:将子问题的解组合为原问题的解。

归并的算法思想:

俩个已经有序的数组A,B合并为一个有序的数组C。

数组A:23,47,81,95 数组B:7,14,39,55,62,74

A[0]>B[0] ? C[0]=B[0] C[0]=A[0]; 

 以上便是归并的主要思想。

归并排序就是以这种思想为主加之递归的思想组成。即将已知的一个数组拆分为两个子数组,

在分别将俩个子数组再次分别拆分为俩个子数组,直到无法拆分为止,即子数组只有一个数组元素,然后对每个子数组排序,使之成为有序子数组,然后将子数组合并。最后形成一个排序好的完整数组。

递归-归并排序的缺点

1:归并排序需要一个和原数组大小相等的数组辅助,进行数据的排序。消耗额外的内存。

2:递归是一种很好的解决问题的思路,但是递归由于需要保存“相关参数以及引用地址”,所以递归会有额外的内存开销。

所以综上,当数据量非常大的时候使用递归-归并排序就需要考虑“空间问题”。

归并排序是一个运行时间为NlgN的算法

以下是java实现递归-归并排序

public class GuiBingOrder {

private int[] Array;

private int currentIndex;

private int maxIndex;

public GuiBingOrder(int size) {
                    this.Array = new int[size];
                    this.currentIndex = 0;
                    this.maxIndex = size-1;
          }

public void insert(int value) {
                  if(this.maxIndex<this.currentIndex) {
                      System.out.println("数组已满");
                  }else {
                      this.Array[this.currentIndex++] = value;
                  }
           }

public void doOrder() {//开始排序
                 int[] orderArray = new int[this.currentIndex];  //需要额外开销的数组
                 this.GuiBinOrder(orderArray,0,this.currentIndex-1);
           }

private void GuiBinOrder(int[] orderArray,int begin,int end) {
                 if(end==begin) { //当数组不可拆分时,即只有一个元素时
                      return;
                 }
                 int middle = (begin+end)/2;
                 this.GuiBinOrder(orderArray,begin, middle); //递归的思想:对左半边数组进行拆分
                 this.GuiBinOrder(orderArray,middle+1, end); //递归的思想:对右半边数组进行拆分
                 this.order(orderArray,begin,middle+1,end);//归并的思想:对子数组进行排序合并
            }

private void order(int[] orderArray,int begin,int middle,int end) {
                   int i = begin;
                   int j = middle;//右边子数组起始
                   int mid = middle-1;//左边子数组尾
                   int size = end-begin+1;
                   int index = 0;

while(i<=mid&&j<=end) {     //A[0]>B[0] ? C[0]=B[0] : C[0]=A[0];  比较并插入数组C   A数组相当于左边子数组,B数组相当于右边子数组。
                            if(this.Array[i]>this.Array[j]) {
                                  orderArray[index++]=this.Array[j++];
                            }else {
                                  orderArray[index++]=this.Array[i++];
                            }
                  };

while(i<=mid) {//当右边子数组B为空时,左边子数组A依然有元素,将剩余元素依次插入数组C
                            orderArray[index++] = this.Array[i++];
                  };

while(j<=end) {//当左边子数组A为空时,右边子数组B依然有元素,将剩余元素依次插入数组C
                           orderArray[index++] = this.Array[j++];
                  };

for(index=0;index<size;index++) { //将额外开销数组中已排序好的元素依次从 本次递归起始点复制回原数组
                           this.Array[begin+index] = orderArray[index];
                  }
          }

public void show() {
                   for (int i : Array) {
                       System.out.println(i);
                   }
           }

}

排序结果为:4、15、21、32、58、61、75、78、83、89

 

递归-归并排序 思想 JAVA实现的更多相关文章

  1. 归并排序算法 java 实现

    归并排序算法 java 实现 可视化对比十多种排序算法(C#版) [直观学习排序算法] 视觉直观感受若干常用排序算法 算法概念 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Di ...

  2. 剑指Offer——归并排序思想应用

    剑指Offer--归并排序思想应用 前言 在学习排序算法时,初识归并排序,从其代码量上感觉这个排序怎么这么难啊.其实归并排序的思想很简单:将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列 ...

  3. 快速排序(一) 思想 JAVA实现

    已知数组59.71.37.56.88.96.21.58.48.43 采用快速排序将数组有序. 快速排序同样采用了“分治策略”,使用递归的思路来实现算法. 快速排序的算法思想: 9.71.37.56.8 ...

  4. 【排序算法】归并排序算法 Java实现

    归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 基本思想 可以将一组数组分成A,B两组 依次类推,当分出来的小组只有一 ...

  5. 二叉搜索树 思想 JAVA实现

    二叉搜索树:一棵二叉搜索树是以一棵二叉树来组织的,这样一棵树可以使用链表的数据结构来表示(也可以采用数组来实现).除了key和可能带有的其他数据外,每个节点还包含Left,Right,Parent,它 ...

  6. 基本算法思想Java实现的详细代码

    基本算法思想Java实现的详细代码 算法是一个程序的灵魂,一个好的算法往往可以化繁为简,高效的求解问题.在程序设计中算法是独立于语言的,无论使用哪一种语言都可以使用这些算法,本文笔者将以Java语言为 ...

  7. 算法——快速排序迭代式和递归式的Java实现

    快速排序迭代式和递归式的Java实现 快速排序基于分治法的思想,在待排序表中任选一值作为中枢值 pivot,一趟快排将所有大于该值的元素置于一边,小于该值的元素置于另一边,这样一个元素在排序中的最终位 ...

  8. 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java

    前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...

  9. 二叉树3种递归和非递归遍历(Java)

    import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...

随机推荐

  1. freemodbus modbus TCP 学习笔记

    1.前言     使用modbus有些时间了,期间使用过modbus RTU也使用过modbus TCP,通过博文和大家分享一些MODBUS TCP的东西.在嵌入式中实现TCP就需要借助一个以太网协议 ...

  2. struts2中s:iterator的使用(2个list嵌套循环)

    <s:iterator value="packagePlateTbls" id="plateTbls"> <tr> <td cla ...

  3. hibernate反向生成奇葩错误

    错误场景 最近搞一个hibernate的项目,由于好久不用hibernate了,稍微有点生疏(自从用了ibatis–>mybatis后).这个项目用了hibernate,和ibatis.myba ...

  4. Django模板语言之组合搜索

    url.py from django.conf.urls import url from django.contrib import admin from app01 import views url ...

  5. 【更多教程关注公众号全要买】1-2 Disruptor与BlockingQueue压力测试性能对比

    JDK所提供的BlockingQueue替换成Dis

  6. 【总结整理】原创概念原创idea---摘自《结网》

    假如你有一个原创想法,搜索引擎是否已有现成产品与自己的想法一致,如果有,研究他可以节省很多摸索的时间:若没有,那就是一个货真价实的原创idea: 第一类:受到现有产品的启发,将既有概念进行了转换. 第 ...

  7. 关于PHP的一个坑爹问题(页面刷新)

    最近在用PHP做一个服务端和一个客户端,在快要完工的时候,出现了一个重大问题---- 当在客户端手动输入IP和端口的时候,一按连接,OK,连接成功,嘻嘻,就在我自以为大功告成的时候,来了个晴天霹雳,一 ...

  8. opennebula 一些问t题讨论

    ou_ian - June 8th, 2011 11:13 am非常想请教一下如何设置VM的ip为DHCP? 我们的VM都需要通过eth0 (通过公司的DHCP获得ip)来连接到公司的网络(Inter ...

  9. opennebula 镜像池

    { "IMAGE_POOL": { "IMAGE": [ { ", ", ", "TEMPLATE": { & ...

  10. Python 安装selenium

    一.报错信息 No module named 'selenium' 二.系统环境 操作系统:Win10 64位 Python版本:Python 3.7.0 三.安装参考 1.使用pip安装seleni ...