归并排序 MergeSort
今天第一次看懂了严奶奶的代码( ̄▽ ̄)~*,然后按照厌奶那的思路进行了一波coding,稍加调试后即可跑起来。
学习链接:排序七 归并排序、图解排序算法(四)之归并排序
merge函数:将两个有序序列拼接成一个有序序列
//对[a,b]∈in,[b+1,c]∈in进行排序。
//对in中的数据进行排序之后,输出到out中
//升序
void merge(int in[],int a,int b,int c){
//设置变量i对[a,b]进行遍历,j对[b+1,c]进行遍历,k对out进行遍历
int[] out=new int[in.length];
int i,j,k;
for(i=a,j=b+1,k=a;
i<=b && j<=c;
k++){
if(in[i]<in[j]){//挑选最小的元素放入out中
out[k]=in[i++];//i∈[a,b]中的元素是最小的
}else{
out[k]=in[j++];//j∈[b+1,c]中的元素是最小的
}
}
//遍历完之后,对剩余元素进行处理
int m=0,n=0;
boolean move=false;
if(i<=b){m=i;n=b;move=true;} //i∈[a,b]中的元素没有遍历完
if(j<=c){m=j;n=c;move=true;} //j∈[b+1,c]中的元素没有遍历完
for(i=m;i<=n && move;i++) out[k++]=in[i];
for(i=a;i<=c;i++) in[i]=out[i];//临时数组放回原数组 int t;
t=0;
}
递归函数MSort:
//递归函数
void MSort(int in[],int a,int b){//将[a,b]的元素进行排序
if(a!=b){
int split=(a+b)/2;
MSort(in,a,split);
MSort(in,split+1,b);
merge(in,a,split,b);//栈底
}
}
归并排序MergeSort:
MergeSort(int[] nums){
MSort(nums,0,nums.length-1);
sortAns=nums;
}
完整代码:
public class Main {
public static void main(String[] args) {
int []nums={2,1,3,0,-1,12,90,23,1};
MergeSort sort=new MergeSort(nums);
System.out.print(sort);
sort.test();
}
}
class MergeSort{
int [] sortAns;
public String toString(){
int i;
String str=new String("");
for(i=0;i<sortAns.length;i++) str+=String.valueOf(sortAns[i])+" ";
str+="\n";
return str;
}
//对[a,b]∈in,[b+1,c]∈in进行排序。
//对in中的数据进行排序之后,输出到out中
//升序
void merge(int in[],int a,int b,int c){
//设置变量i对[a,b]进行遍历,j对[b+1,c]进行遍历,k对out进行遍历
int[] out=new int[in.length];
int i,j,k;
for(i=a,j=b+1,k=a;
i<=b && j<=c;
k++){
if(in[i]<in[j]){//挑选最小的元素放入out中
out[k]=in[i++];//i∈[a,b]中的元素是最小的
}else{
out[k]=in[j++];//j∈[b+1,c]中的元素是最小的
}
}
//遍历完之后,对剩余元素进行处理
int m=0,n=0;
boolean move=false;
if(i<=b){m=i;n=b;move=true;} //i∈[a,b]中的元素没有遍历完
if(j<=c){m=j;n=c;move=true;} //j∈[b+1,c]中的元素没有遍历完
for(i=m;i<=n && move;i++) out[k++]=in[i];
for(i=a;i<=c;i++) in[i]=out[i];//临时数组放回原数组
int t;
t=0;
}
//递归函数
void MSort(int in[],int a,int b){//将[a,b]的元素进行排序
if(a!=b){
int split=(a+b)/2;
MSort(in,a,split);
MSort(in,split+1,b);
merge(in,a,split,b);//栈底
}
}
MergeSort(int[] nums){
MSort(nums,0,nums.length-1);
sortAns=nums;
}
MergeSort(){}
}
归并排序 MergeSort的更多相关文章
- 排序算法THREE:归并排序MergeSort
/** *归并排序思路:分治法思想 O(nlogn) * 把数组一分为二,二分为四 * 四和为二,二和为一 * */ /** * 归并排序主方法 *@params 待排序的数组 *@params 初始 ...
- 普林斯顿大学算法课 Algorithm Part I Week 3 归并排序 Mergesort
起源:冯·诺依曼最早在EDVAC上实现 基本思想: 将数组一分为(Divide array into two halves) 对每部分进行递归式地排序(Recursively sort each ha ...
- 分治法——归并排序(mergesort)
首先上代码. #include <iostream> using namespace std; int arr[11]; /*两个序列合并成一个序列.一共三个序列,所以用 3 根指针来处理 ...
- [图解算法] 归并排序MergeSort——<递归与分治策略>
#include"iostream.h" void Merge(int c[],int d[],int l,int m,int r){ ,k=l; while((i<=m)& ...
- 《算法导论》归并排序----merge-sort
伪代码请见<算法导论>2.3节 merge-sort实现: public class MergeSort { public static void sort(double [ ...
- 算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-006归并排序(Mergesort)
一. 1.特点 (1)merge-sort : to sort an array, divide it into two halves, sort the two halves (recursivel ...
- C#数据结构与算法系列(二十三):归并排序算法(MergeSort)
1.介绍 归并排序(MergeSort)是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分(divide)成一些小的问题然后递归求解, 而治(conquer)的阶段则将分的阶段得 ...
- 排序算法——QuickSort、MergeSort、HeapSort(C++实现)
快速排序QuickSort template <class Item> void quickSort (Item a[], int l, int r) { if (r<=l) ret ...
- POJ2299 Ultra-QuickSort(归并排序求逆序数)
归并排序求逆序数 Time Limit:7000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Descri ...
随机推荐
- vertica创建新用户并授权
1.创建用户,并设置密码: create user user1 identified by 'pwd1'; 2.把角色授权给用户(dbduser是普通角色): grant dbduser to use ...
- 提高性能,MySQL 读写分离环境搭建(一)
这是松哥之前一个零散的笔记,整理出来分享给大伙! MySQL 读写分离在互联网项目中应该算是一个非常常见的需求了.受困于 Linux 和 MySQL 版本问题,很多人经常会搭建失败,今天松哥就给大伙举 ...
- python利用ThreadPoolExecutor实现有任务异常,就终止线程池中的所有剩余任务
先描述一下场景: 我有一批任务需要放入线程池中去处理,但是一旦线程池中有1个任务出现了异常(抛了Exception)就将线程中尚未开始的任务全部取消不执行. 需要说明的是正在执行的任务因为无法撤销,所 ...
- THUPC2019/CTS2019/APIO2019自闭记
自闭了,自闭选手不配拥有游记.
- SSL证书格式转换
crt格式转pem openssl x509 -in www.x.com.crt -out www.x.com.pem openssl x509 -in mycert.crt -out mycert. ...
- [转] vue父组件触发子组件事件
1. 父组件中获取子组件方法 $children 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <template> < ...
- SpringMVC重要注解 @ControllerAdvice
@ControllerAdvice,是Spring3.2提供的新注解,从名字上可以看出大体意思是控制器增强.让我们先看看@ControllerAdvice的实现: package org.spring ...
- 线程之间灵活传递信号(ManualResetEventSlim )
当主程序启动时,首先创建ManualResetEventSlim 类的一个实例.然后启动三个线程,等待事件信号通知它们继续执行. /// <summary> /// 创建 ManualRe ...
- 微信小程序环境配置和开发!!
1.登陆微信公众平台小程序,下载 普通小程序开发者工具.或者 小游戏开发者工具. 2.新建项目需要填以下几点,然后初始demo如下,注意rpx是分成750份的单位. 3.点击预览,用微信扫描二维码,代 ...
- H5新增form控件和表单属性
第一个知识点:表单的属性及总结 第二个知识点:H5新增的表单控件和属性以及总结 第一个知识点: 我们常见的表单验证有哪些呢 text 文本框标签 password 密码框 checkbox 多选框 r ...