• 归并排序-JAVA实现


      1 package com.iloveu.xxx;
      2 
      3 public class MergeSort {
      4     
      5     static final int SIZE = 15;
      6     
      7     static void mergeOne(int a[],int b[],int n,int len)
      8     {
      9         int i,j,k,s,e;
     10         s=0;
     11         while(s+len<n){
     12             e = s+2*len-1;
     13             if(e>=n){//最后一段可能少于len个节点
     14                 e = n -1;
     15             }
     16             //相邻有序段合并
     17             k=s;
     18             i=s;
     19             j=s+len;
     20             while(i<s+len && j<=e){//如果两个有序表都未结束时,循环比较
     21                 if(a[i]<=a[j]){//如果较小的元素复制到数组b中
     22                     b[k++]=a[i++];
     23                 }else{
     24                     b[k++]=a[j++];
     25                 }
     26             }
     27             while(i<s+len){//未合并的部分复制到数组b中
     28                 b[k++]=a[i++];
     29             }
     30             while(j<=e){//未合并的部分复制到数组b中
     31                 b[k++]=a[j++];
     32                 
     33             }
     34             s=e+1;//下一对有序段中左段的开始下标
     35         }
     36         if(s<n){//将剩余的一个有序段从数组a中复制到数组b中
     37             for(;s<n;s++){
     38                 b[s] = a[s];
     39             }
     40             
     41         }
     42     }
     43     
     44     static void mergeSort(int a[],int n)//合并排序
     45     {
     46         int h,count,len,f;
     47         
     48         count = 0;//排序步骤
     49         len = 1;//有序序列的长度
     50         f = 0;//变量f作标志
     51         
     52         int[] p = new int[n];
     53         while(len<n){
     54             if(f==1){//交替在a和p之间合并
     55                 mergeOne(p,a,n,len);//p合并到a
     56             }else{
     57                 mergeOne(a,p,n,len);//a合并到p
     58             }
     59             len = len*2;//增加有序序列长度
     60             f=1-f;//使f值在0和1之间切换
     61             
     62             count++;
     63             System.out.printf("第"+count+"步排序结果:");//输出每步排序的结果
     64             for(h=0;h<SIZE;h++){
     65                 System.out.printf(" "+a[h]);
     66                 
     67             }
     68             System.out.printf("
    ");
     69         }
     70         if(f==1){//如果进行了排序
     71             for(h=0;h<n;h++){//将内存p中的数据复制回数组a
     72                 a[h]=p[h];
     73             }
     74         }
     75     }
     76 
     77     public static void main(String[] args) {
     78         // TODO Auto-generated method stub
     79         int[] shuzu=new int[SIZE];
     80         int i;
     81         
     82         for(i=0;i<SIZE;i++){
     83             shuzu[i] = (int) (100+Math.random()*(100+1));//初始化数组
     84         }
     85         
     86         System.out.print("排序前的数组为:
    ");//输出排序前的数组
     87         for(i=0;i<SIZE;i++){
     88             System.out.print(shuzu[i]+" ");
     89             }
     90             System.out.print("
    ");
     91             
     92             mergeSort(shuzu,SIZE);//排序操作
     93             
     94             System.out.print("排序后的数组为:
    ");
     95             for(i=0;i<SIZE;i++){
     96                 System.out.print(shuzu[i]+" ");//输出排序后的数组
     97                 try {
     98                     Thread.sleep(1000);
     99                 } catch (InterruptedException e) {
    100                     // TODO Auto-generated catch block
    101                     e.printStackTrace();
    102                 }
    103             }
    104             System.out.print("
    ");
    105         }
    106 
    107 
    108 }
  • 相关阅读:
    HDU 1051
    HDU 1236
    递归求gcd(a,b)
    HDU 1372
    HDU 1312
    HDU 1253
    HDU 1072
    ...别人的推荐、
    搜索总结、
    TortoiseHg简单的入门使用说明
  • 原文地址:https://www.cnblogs.com/haciont/p/7859364.html
Copyright © 2020-2023  润新知