MergeSort 归并排序(java)
2024-10-11 12:11:19
MergeSort 归并排序
排序思想:1,分解待排序的n个元素为两个子列,各为n/2个元素
2,若子列没有排好序,重复1步骤,每个子列继续分解为两个子列,直至被分解的子列个数为1
3,子列元素个数为1,说明这个子列已经排好序,开始逐级合并子序列进行排序 该算法需要合并分解的子序列,所以需要额外一个辅助过程Merge(A,p,q,r)来完成两个子列的合并,A为数组,p,q,r为数组下标,其中A[p,q]和A[q+1,r]为两个已经排好序的子序列,∞代表哨兵值。
Merge伪代码:
Merge(A,p,q,r)
n1 = q - p + 1
n2 = r - q
let L[1..n1+1] and R[1..n2+1] be new arrays
for i = 1 to n1
L[i] = A[p+i-1]
for j = 1 to n2
R[j] = a[q+j]
L[n1+1] = ∞
R[n2+1] = ∞
i = 1
j = 1
for k = p to r
if L[i] <=R[j]
A[k] = L[i]
i = i + 1
else
A[k] = R[j]
j = j + 1 MergeSort(归并排序)伪代码:
MergeSort(A,p,r)
if p < r
q = (p+r)/2
MergeSort(A,p,q)
MergeSort(A,q+1,r)
Merge(A,p,q,r)
public class MergeSort{
public static void main(String[] args) {
int A[] = {
1,6,4,5,2,9,7,23,56,43,98,56
};
int[] temp = new int[A.length];
MergeSort(A,temp,0,A.length-1);
for (int i:A){
System.out.print(i+" ");
}
} public static void MergeSort(int[] A,int[] temp,int start,int end){
if (start<end){
int mid = (start+end)/2;
//把数组分解为两个子列
MergeSort(A,temp,start,mid);
MergeSort(A,temp,mid+1,end);
//逐级合并两个子列
Merge(A,temp,start,mid,end);
}
} public static void Merge(int[] A,int[] temp,int start,int mid,int end){
int i = start;
int j = mid+1;
int k = 0;
while(i<=mid&&j<=end){
if (A[i]<=A[j]) {
temp[k] = A[i];
i++;
k++;
}else {
temp[k] = A[j];
j++;
k++;
}
}
while(i<=mid){
temp[k] = A[i];
k++;
i++;
}
while(j <= end){
temp[k] = A[j];
k++;
j++;
}
for (int m = 0; m<k; m++) {
A[start+m] = temp[m];
}
}
}
最新文章
- java IO之AutoCloseable,Closeable和Flushable接口
- js学习笔记7----return,arguments及获取元素样式
- KindEditor图片上传到七牛云
- 关于 mkimage
- 如何判断C#的Finalizer线程有没有被阻塞
- Python3.5创建虚拟环境
- C#基础面试
- 使用GraceNote Web API发展Mac发现音乐信息的应用
- 性能测试分享:Jmeter多机协作原理
- ASP.NET Core 共享第三方依赖库部署的Bug(*.deps.json on 2.2.0 or 4.6.0 版本)
- Android之人脸识别
- linux统计使用最多的10个命令
- 基于MVC 的Quartz.Net组件实现的定时执行任务调度
- tomcat生成调试日志配置
- redis 高级特性 不要太好用
- android 点击数字跳转到电话界面
- np.random.randn()、np.random.rand()、np.random.randint()
- STM32F103 ucLinux内核没有完全启动
- Java,vue.js,jsp for循环的写法
- SPOJ4717——Grid Points in a Triangle
热门文章
- 跟我一起阅读Java源代码之HashMap(一)
- OSSpinLockLock加锁机制,保证线程安全并且性能高
- 20165318 2017-2018-2 《Java程序设计》第八周学习总结
- 20165318 预备作业3 Linux安装及学习
- 1260. [CQOI2007]涂色【区间DP】
- 3942: [Usaco2015 Feb]Censoring
- Kubernetes中的资源调度与资源管理
- Alpha冲刺(5/10)——追光的人
- 20155314 2016-2017-2 《Java程序设计》第1周学习总结
- Mac app打包成dmg