Java源代码

public class Mergesort1 {

    public static void merge(int[]a,int low,int mid,int high){//对两组已经排序的数组进行合并
int[]b=new int[high-low+1]; //临时数组,存储个数为high - low + 1个数据
int s=low;
int t=mid+1;
int k=0;
while(s<=mid&&t<=high){ //直至前半部或后半部数据完全录入暂存
if(a[s]<=a[t]) //如果前半部的数据小于后半部的,前半部数据暂存
b[k++]=a[s++];
else //否则后半部数据暂存,并下标自加
b[k++]=a[t++];
}
while(s<=mid)
b[k++]=a[s++];
while(t<=high)
b[k++]=a[t++];
for(int i=0;i<b.length;i++){ //将暂存的数据重新填充至array[low]--array[high]中
a[low+i]=b[i];
}
}
public static void mergesort(int a[],int low,int high){//对数组进行递归排序
int mid;
if(low<high){
mid=(low+high)/2;
mergesort(a,low,mid);
mergesort(a,mid+1,high);
merge(a,low,mid,high);
}
}
public static void main(String[]args){
int[]a={4,34,2,56,5,9,6,45,8,3};
System.out.println("排序前数组为:");
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" "); }
mergesort(a,0,a.length-1);
System.out.println("\n排序后数组为:");
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");}
} }

运行结果:

排序前数组为:
4 34 2 56 5 9 6 45 8 3
排序后数组为:
2 3 4 5 6 8 9 34 45 56

C++源代码:

#include <iostream>

using namespace std;

void Merge(int *array, int low, int middle, int high)  //合并
{
int *A = new int[high - low + ]; //临时数组,存储个数为high - low + 1个数据
int i = low;
int j = middle + ;
int k = ;
while(i <= middle && j <= high) //直至前半部或后半部数据完全录入暂存
{
if(array[i] < array[j]) //如果前半部的数据小于后半部的,前半部数据暂存
A[k++] = array[i++];
else //否则后半部数据暂存,并下标自加
A[k++] = array[j++];
} while(i <= middle) //保证前半部数据录入暂存
A[k++] = array[i++];
while(j <= high) //保证后半部数据录入暂存
A[k++] = array[j++];
for(i = low; i <= high; i++) //将暂存的数据重新填充至array[low]--array[high]中
array[i] = A[i - low];
} void MergeSort(int *array, int low, int high)
{
int middle; //二分
if(low < high)
{
middle = (low + high) / ; //二分
MergeSort(array, low, middle); //前半部
MergeSort(array, middle + , high); //后半部
Merge(array, low, middle, high); //合并
}
} int main()
{
cout<<"输入需要排列数据的个数:"; int n;
cin>>n; //录入需要排列的个数
int *array = new int[n];
cout<<endl<<"请输入数据:"<<endl; for(int i = ; i < n; i++)
{
cin>>array[i]; //录入未排序的数据
} MergeSort(array, , n - ); //进行排序 cout<<"排列后数据:"<<endl;
for(int j = ; j < n; j++) //输出排列结果
{
cout<<array[j]<<" ";
}
cout<<endl;
return ;
}

运行结果:

分治法解决合并排序(c++和Java源代码)的更多相关文章

  1. 用分治法解决最近点对问题:python实现

    最近点对问题:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小.需要说明的是理论上最近点对并不止一对,但是无论是寻找全部还是仅寻找其中之一,其原理没有区别,仅需略作改造即可 ...

  2. Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)

    1.问题描写叙述 写一个高效的算法.从一个m×n的整数矩阵中查找出给定的值,矩阵具有例如以下特点: 每一行从左到右递增. 每一列从上到下递增. 2. 方法与思路 2.1 二分查找法 依据矩阵的特征非常 ...

  3. p1257 平面上最接近点对---(分治法)

    首先就是一维最接近点的情况... #include<iostream> #include<cstdio> #include<cstring> #include< ...

  4. 分治法求一个N个元素数组的逆序数

    背景  逆序数:也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时, ...

  5. 算法笔记_065:分治法求逆序对(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 分治法(归并排序)   1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数.要求时间效率尽可能高. 那么,何为逆序对? 引用自百度 ...

  6. Java算法——分治法

         一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简 ...

  7. 算法笔记_014:合并排序(Java)

    1 问题描述 给定一组数据,使用合并排序得到这组数据的非降序排列. 2 解决方案 2.1 合并排序原理简介 引用自百度百科: 合并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Div ...

  8. Java与算法之(11) - 合并排序

    天下事,合久必分,分久必合.合并排序的基本思想正是先分再合. 例如对3, 1这个数列排序,首先是分,分为3和1两个数列,然后再合并并排序.合并需要额外的辅助空间,即建立一个两个数列长度之和的空数组用于 ...

  9. java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述

    算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...

随机推荐

  1. Bootstrap学习(2)--表单

    Bootstrap里的role属性,增强标签的语义化,提高识别力,  如:<form role="form"> input.select.textarea等元素,在Bo ...

  2. 空格哥的第一篇Blog

    首先十分感谢博客园在这里给我的平台,我在这里学习到了很多东西,响应的,我也想要在这里记录下自己的心路历程!在学习的过程中,希望博客园一直陪伴我,小弟在这里不胜感激!这是小弟的第一篇博客,很多东西都不是 ...

  3. [TCPIP] 传输控制协议 Note

    TCPIP  TCP 传输控制协议 TCP提供一种面向连接的,可靠的字节流服务. 面向连接意味着两个使用TCP的应用在传输数据之前先建立一个TCP连接,这个过程跟打电话相似.在一个TCP连接中仅有两方 ...

  4. Linux系统结构

        Linux系统一般有4个主要部分: 内核.shell.文件系统和应用程序.内核.shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序.管理文件并使用系统.部分层次结构如图 ...

  5. Android studio Gradle 教程

    一 . Gradle基础:https://segmentfault.com/a/1190000002439306 module下的gradle文件: // 声明是Android程序 apply plu ...

  6. CentOS 7 程序自启动的问题

    Mysql具体的安装方法见http://www.cnblogs.com/yoyotl/p/5752437.html 但是关于自启动部分需要多一些说明. 一.问题现象: 系统重启后,发现mysqld服务 ...

  7. Ubuntu 修改 ssh 登录后的欢迎信息

    /etc/update-motd.d/90-updates-available cd /etc/update-motd.d/ vi 10-help-text 修改或者注释掉里面的内容 vi 90-up ...

  8. [MVC_Json序列化]Json字符串反序列化成C#对象

    上一篇中有Json序列化相关问题得到了解决. 那么结果集为Json串时,如何将Json串转成C#对象呢? 现举例说明: -现有如下字符串数据 string k = "{\"ring ...

  9. TCP/IP协议学习(六) 链路层详解

    学习知识很简单,但坚持不懈却又是如此的困难,即使一直对自己说"努力,不能停下"的我也慢慢懈怠了... 闲话不多说,本篇将讲述TCP/IP协议栈的链路层.在本系列第一篇我讲到,TCP ...

  10. linux下使用多线程编写的聊天室

    自从开始学linux网络编程后就想写个聊天室,一开始原本打算用多进程的方式来写,可是发觉进程间的通信有点麻烦,而且开销也大,后来想用多线程能不能实现呢,于是便去看了一下linux里线程的用法,实际上只 ...