今天笔试4399做了一道归并排序,记录一下
题目是,输入一组数据用归并排序进行排序。
执行过程是:

import java.util.Scanner;//不写是无法用Scanner类的 public class Main { public static void main(String[] args) { Scanner scanner=new Scanner(System.in);//把输入数字写到scanner中 String input=scanner.next();//将字符串一个个输入到input中 String[] s=input.split(",");//用,隔开后一个个装到数组中,此时数组中存放的还是字符 int []nums=new int[s.length];//建立一个空字符串 for(int i=0; i<s.length; i++){ nums[i]=Integer.parseInt(s[i]);//将字符强行转换成int类型装进数组中 } int[]tmp=new int[s.length];//再new一个新的数组tmp mergeSort(nums,0,nums.length-1,tmp); for(int i=0;i<nums.length;i++){ System.out.print(nums[i]+" ");//用空格隔开输出 } } public static void mergeSort(int[] arr,int low,int height,int[] tmp){ if (low<height){ int bim=(low+height)/2;//取中间值,假设3/2的int类型值等于1,向下取整 mergeSort(arr,low,bim,tmp);//分为左半边序列,一直分,分到只剩一个或者两个 mergeSort(arr,bim+1,height,tmp);//分为右半边序列 merge(arr,low,bim,height,tmp);//将值进行比较,合并 } } public static void merge(int[]arr,int low,int bim,int height,int[]tmp){ int i=0; int j=low,k=bim+1; while(j<=bim&&k<=height){ if(arr[j]<arr[k]){//取小的值放前面 tmp[i++]=arr[j++]; }else{ tmp[i++]=arr[k++]; } } while(j<=bim){//左边剩余的值放到后面 tmp[i++]=arr[j++]; } while(k<=height){//右边剩余的值放后面 tmp[i++]=arr[k++]; } for (int t=0;t<i ;t++ ){ arr[low+t]=tmp[t];//low把右边序列的分开 } } }

归并排序看起来不难,但理解起来还是有点难度。
本文来自博客园,作者:阿霖找BUG,转载请注明原文链接:https://www.cnblogs.com/lin-07/p/17271135.html
浙公网安备 33010602011771号