zoukankan      html  css  js  c++  java
  • 归并排序-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 }
  • 相关阅读:
    npm 操作
    vue 下拉框选中不显示的问题
    VUE项目中遇到的Bug总结
    Websocket练手
    Mysql 去重取最新的一条数据
    C# 一列数的规则如下:1、1、2、3、5、8、13..…...求第30位数是多少,用递归算法实现
    冒泡排序 升序 降序(笔试)
    Sql语句查询成绩大全(Mysql,sqlserver,oracle)常遇笔试题
    C# ,.net 对比两个List的方法 亲测
    C#当前时间加、减指定时间
  • 原文地址:https://www.cnblogs.com/haciont/p/7859364.html
Copyright © 2011-2022 走看看