zoukankan      html  css  js  c++  java
  • 归并排序

      归并排序的思想为分治法,即将一个数组不断往下划分,直至为单一的元素,然后将两个元素进行合并。

      俩个有序的数组合并的方法:假设现有a,b两个有序数组,各自起点分别为i=0,j=0,如果a[i]<b[j],则将a[i++]放入新的一个数组中,否则取另一个b[j++],继续与b[j]或者a[i]进行比较。这样即简单合并为一个有序数组。

      而归并排序,首先实现的就是把数组规划。将数组不断划分,直至划分只有单个数,然后开始将最底层的两个数,即可以看作为两个有序的数组,进行归并。每归并一次,序列扩大,继续归并。

      归并排序中的数组划分,用到的是递归的方式。

      

     1 import java.util.Arrays;
     2 public class Merge {  //将两个有序的序列合并成一个
     3     public void MergeSort(int first,int mid,int last,int[] A,int[] temp){    
     4         int i=first,j=mid+1;
     5         int index=0;
     6         while(i<=mid && j<=last){
     7             if(A[i]>=A[j]){
     8                 temp[index++]=A[j++];
     9             }
    10             else{
    11                 temp[index++]=A[i++];
    12             }
    13         }
    14         while(j<=last){
    15             temp[index++]=A[j++];
    16         }
    17         while(i<=mid){
    18             temp[index++]=A[i++];
    19         }
    20         for(i=0;first+i<=last;i++){
    21             A[first+i]=temp[i];
    22         }
    23 24     }
    25     public void MergeArray(int first,int last,int[] A,int[] temp){    //数组划分
    26         int mid=(first+last)/2;
    27         if(first<last){
    28             MergeArray(first,mid,A,temp);    //左序列    不断的递归调用自身,向下递归,直至first=last,即分为了单一的一个数

    29 MergeArray(mid+1,last,A,temp); //右序列

    30 MergeSort(first,mid,last,A,temp);   //在递归到了最底层,然后开始把两个数字(看作为两个有序的序列)开始归并一个新的序列,然后向上执行新的归并 31 } 32 } 33 Merge(int[] A,int n){    //入口 34 int[] temp=new int[n]; 35 MergeArray(0,n-1,A,temp); 36 } 37 }

      此归并排序的关键在与划分为单一的元素即最小有序序列后开始向上归并。

      

    jeyfang
  • 相关阅读:
    【技术评网】说说豆瓣的URL设计
    在这一刻,还是忍不住满眼泪水
    装Sybase,装WAS 6.1的时候报错java.exe损坏的图象
    JasperRepor导出报表通用类
    XSS跨站攻击
    sql 脚本
    解决在无线网络下本机无法连接linux(红帽)虚拟机问题
    pl /sql导入导出表结构,表数据,sql脚本
    asp.net关于WEB端用户重复提交问题。禁用服务器控件按钮问题。
    MQ命令学习总结大全MQ常用命令
  • 原文地址:https://www.cnblogs.com/jeyfang/p/5262566.html
Copyright © 2011-2022 走看看