归并排序 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 ...
随机推荐
- Python之threading多线程,多进程
1.threading模块是Python里面常用的线程模块,多线程处理任务对于提升效率非常重要,先说一下线程和进程的各种区别,如图 概括起来就是 IO密集型(不用CPU) 多线程计算密集型(用CPU) ...
- 前端性能优化--回流(reflow)和重绘(repaint)
HTML加载时发生了什么 在页面加载时,浏览器把获取到的HTML代码解析成1个DOM树,DOM树里包含了所有HTML标签,包括display:none隐藏,还有用JS动态添加的元素等. 浏览器把所有样 ...
- 浙大版《C语言程序设计(第3版)》题目集 --总结
浙大版<C语言程序设计(第3版)>题目集 此篇博客意义为总结pta上浙大版<C语言程序设计(第3版)>题目集所做题目的错误点,心得体会. 1.练习2-10 计算分段函数[1] ...
- 探索FFmpeg
Part1 :FFmpeg简介 FFmpeg定义 FFmpeg是一款音视频编解码工具,为开发者提供了大量音视频处理接口. FF指的是"Fast Forward" FFmpeg历史 ...
- centos切换php版本
centos服务器上安装了php5.3到php7.2版本的php,默认使用php -v,查看到的php版本信息为: 修改环境变量文件:vim /etc/profile shift+g跳转到最后一行环境 ...
- JNDI学习总结(一):JNDI到底是什么?
https://blog.csdn.net/wn084/article/details/80729230 分类专栏: JNDI JNDI是 Java 命名与目录接口(Java Naming and ...
- Java8 Lamda的基本使用
Lamda的基本使用 https://www.cnblogs.com/htyj/p/10133883.html https://segmentfault.com/q/1010000011200292 ...
- JavaScript变量与数据类型
变量 javascript的变量很松散,每个变量初始仅仅用于保存一个占位符而已.定义变量的操作符是 var, var 后面跟着一个标识符--当作变量的名字. 比如: var myname;//定义了一 ...
- layui 日期插件一闪而过
关于一个layui插件日期的问题,在本地调试都是可以的,但发布到服务器上的时候,日期插件一闪而过,后来我以为是各个插件之间的冲突,我就每个插件的排除,但是还是无动于衷,然后我就去官网看了下是,需要加一 ...
- Python轮子
代码复用 会用到的轮子贴在这篇文章中,备用.