分治法解决合并排序(c++和Java源代码)
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源代码)的更多相关文章
- 用分治法解决最近点对问题:python实现
最近点对问题:给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小.需要说明的是理论上最近点对并不止一对,但是无论是寻找全部还是仅寻找其中之一,其原理没有区别,仅需略作改造即可 ...
- Leetcode 240 Search a 2D Matrix II (二分法和分治法解决有序二维数组查找)
1.问题描写叙述 写一个高效的算法.从一个m×n的整数矩阵中查找出给定的值,矩阵具有例如以下特点: 每一行从左到右递增. 每一列从上到下递增. 2. 方法与思路 2.1 二分查找法 依据矩阵的特征非常 ...
- p1257 平面上最接近点对---(分治法)
首先就是一维最接近点的情况... #include<iostream> #include<cstdio> #include<cstring> #include< ...
- 分治法求一个N个元素数组的逆序数
背景 逆序数:也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时, ...
- 算法笔记_065:分治法求逆序对(Java)
目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 分治法(归并排序) 1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数.要求时间效率尽可能高. 那么,何为逆序对? 引用自百度 ...
- Java算法——分治法
一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简 ...
- 算法笔记_014:合并排序(Java)
1 问题描述 给定一组数据,使用合并排序得到这组数据的非降序排列. 2 解决方案 2.1 合并排序原理简介 引用自百度百科: 合并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Div ...
- Java与算法之(11) - 合并排序
天下事,合久必分,分久必合.合并排序的基本思想正是先分再合. 例如对3, 1这个数列排序,首先是分,分为3和1两个数列,然后再合并并排序.合并需要额外的辅助空间,即建立一个两个数列长度之和的空数组用于 ...
- java 合并排序算法、冒泡排序算法、选择排序算法、插入排序算法、快速排序算法的描述
算法是在有限步骤内求解某一问题所使用的一组定义明确的规则.通俗点说,就是计算机解题的过程.在这个过程中,无论是形成解题思路还是编写程序,都是在实施某种算法.前者是推理实现的算法,后者是操作实现的算法. ...
随机推荐
- java动态代理原理
我们经常会用到Java的动态代理技术, 虽然会使用, 但是自己对其中的原理却不是很了解.比如代理对象是如何产生的, InvocationHandler的invoke方法是如何调用的?今天就来深究下Ja ...
- mariadb用户和权限管理
mysql -u root -p insert into mysql.user(Host,User,Password) values('localhost','guest',password('123 ...
- 对teacher表进行增加,删除,修改
<%@page import="java.text.SimpleDateFormat"%> <%@ page language="java" ...
- javascript基础知识show
1.javascript的数据类型是什么 基本数据类型:String,boolean,Number,Undefined,Null 引用数据类型:Object(Array,Date,RegExp,Fun ...
- ubuntu 配置 jdk的一些常见问题
首先下好压缩包.我用的是tar.gz 然后在/usr下解压,用mv或rename修改下文件夹名字,省得名字太长,然后再配置环境变量. so easy. 然而, 接下来你肯定会用 source /et ...
- c++实现简单的链表
注:我是一个编程菜鸟,哪个大神看出来缺陷提点一下,感激不尽. 链表由一个个的节点串联而成,同一由first头指针管理,属于线性表中相比于数组,添加删除方便,但访问又有点慢的数据结构. 第一步:节点 N ...
- 解决IIS上无法添加.NET用户的问题
最近开发了一个简单的管理后台,后台用户管理都用的是AspNetSqlMembershipProvider这一套框架,添加和删除用户的功能在开发阶段通过ASP.NET网站管理工具完成. 部署到服务器上时 ...
- mysql复制一列到另一列
mysql复制一列到另一列 UPDATE 表名 SET B列名=A列名 需求:把一个表某个字段内容复制到另一张表的某个字段. 实现sql语句1: 复制代码代码如下: UPDATE file_man ...
- error CS0117: `UnityEditor.EditorUtility' does not contain a definition for `GetAssetPreview'
have to replace: EditorUtility by AssetPreview
- 分布式事务二阶提交DTS系统
前端时间写新交易系统时,经常碰到事务一致性问题,网上搜了一下,有一些解决方法,采用了扫表补偿的方式来完成,刚开始只有几个接口需要处理,工作量还可以,但是后续随着需求的增加,这些场景错综复杂,导致大量时 ...