归并排序

一、归并排序的基本思想

        将待排序序列R[0...n-1]看成是n个长度为1的有序序列,将相邻的有序表成对归并,得到n/2个长度为2的有序表;将这些有序序列再次归并,得到n/4个长度为4的有序序列;如此反复进行下去,最后得到一个长度为n的有序序列。

综上可知:

归并排序其实要做两件事:

(1)“分解”——将序列每次折半划分

(2)“合并”——将划分后的序列段两两合并后排序






public class Test{
public static void main(String[] arge){
int[] arr = {25,34,45,32,78,12,34,64};
mergeSort(arr, 0, arr.length-1);
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
}

public static void mergeSort(int[] arr,int begin,int end){  //四个参数:原数组,临时数组,首、尾角标
if(begin<end){  //只有一个数,不执行排序
int middle = (begin+end)/2;  //从中间划分为两个子序列
mergeSort(arr, begin, middle);  //对左半边进行递归
mergeSort(arr,middle+1,end);  //对右半边进行递归
merge(arr,begin,end,middle);  //归并
}
}

public static void merge(int[] arr,int begin,int end,int middle){
int i,j;
int temp[] = new int[arr.length+1];
for(i=begin;i<=end;i++){  //将数组存入临时数组
temp[i] = arr[i];
}
i=begin;
j=middle+1;
while(i<=middle && j<=end){
if(temp[i]<=temp[j]){  //左右两边的首个元素,较小的放入原数组
arr[begin++] = temp[i++];
}else{
arr[begin++] = temp[j++];
}
}
while(i<=middle){  //只剩下左边,直接复制
arr[begin++] = temp[i++];
}
while(j<=end){  //只剩下右边,直接复制
arr[begin++] = temp[j++];
}
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值