排序算法之归并排序(Java实现)

Dear 丶 2022-01-05 07:21 392阅读 0赞

归并排序的思想是将局部有序的数组合并为一个大的有序数组,前提是需要保证局部数组有序,如果局部没有顺序,那么就拆分,再合并,最差的情况是,拆到两个数组都只有一个元素的时候,这时候再合并他们就成了一个有序的数组。

涉及到算法上,就是将数组直接分为两部分low~mid,(mid+1)~high,其中mid=(low+high)/2,low=0,high=length-1,然后合并,依次递归每一个拆分的小单元。

  1. package com.xxx.algorithm.sort;
  2. public class MergeSort {
  3. public static void merge(int nums[],int low,int mid,int high){
  4. int array[] = new int[nums.length];
  5. int i = low,j=mid+1;
  6. int size = 0;
  7. while(i<=mid&&j<=high){
  8. if(nums[i]<nums[j]){
  9. array[size++] = nums[i++];
  10. }else{
  11. array[size++] = nums[j++];
  12. }
  13. }
  14. while(i<=mid){
  15. array[size++] = nums[i++];
  16. }
  17. while(j<=high){
  18. array[size++] = nums[j++];
  19. }
  20. for(i=0;i<size;i++){
  21. nums[i+low] = array[i];
  22. }
  23. }
  24. public static void print(int nums[]){
  25. System.out.print("list:");
  26. for(int i=0;i<nums.length;i++){
  27. System.out.print(nums[i] + " ");
  28. }
  29. System.out.println();
  30. }
  31. public static void sort(int nums[],int low,int high){
  32. if(low<high){
  33. int mid = (low+high)/2;
  34. sort(nums, low, mid);
  35. sort(nums, mid+1, high);
  36. merge(nums, low, mid, high);
  37. }
  38. }
  39. public static void main(String[] args) {
  40. int[] nums = {1,4,3,2,7,6,9,5,8,0};
  41. sort(nums, 0, 9);
  42. print(nums);
  43. }
  44. }

这个算法merge()方法中,最后需要把合并的新数组中的元素依次放入原来的数组中,这时候的语句是nums[i+low]=array[i],而不是nums[i]=array[i]。就是这个地方需要注意。

发表评论

表情:
评论列表 (有 0 条评论,392人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序算法归并排序

    归并排序> 之前曾经实现过堆排序,它用到了完全二叉树,但是堆的设计本身就是比较复杂的,而今天要实现的归并排序同样的也用到了完全二叉树的思想,这种思想比堆排序较为简单.

    相关 排序算法归并排序Java实现

    归并排序的思想是将局部有序的数组合并为一个大的有序数组,前提是需要保证局部数组有序,如果局部没有顺序,那么就拆分,再合并,最差的情况是,拆到两个数组都只有一个元素的时候,这时候

    相关 排序算法归并排序

    归并排序是利用递归与分治思想将数据序列划分成越来越小的半子序列,在对其进行排序,最后利用递归将排好序的半子序列合并成越来越大的有序序列。 归并排序中,归 即是递归的意思,即递