美文网首页
Android 算法之排序算法(归并排序)

Android 算法之排序算法(归并排序)

作者: Kevin_小飞象 | 来源:发表于2021-08-02 09:01 被阅读0次

    归并排序

    归并排序(Merge Sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为 2-路归并。

    算法描述

    • 把长度为 n 的输入序列分成两个长度为 n/2 的子序列;
    • 对这两个子序列分别采用归并排序;
    • 将两个排序好的子序列合并成一个最终的排序序列。

    动图演示

    04.gif

    实例

    1. 代码实现
    public class MergeTest {
        public static void main(String[] args) {
            int[] sort ={3,2,1,4,6,5,8,9,10,7} ;
            System.out.println("排序前:");
            printArray(sort);
            int[] tmp = new int[sort.length];
            mergeSort(sort,0,sort.length-1,tmp);
            System.out.println("\n排序后:");
            printArray(sort);
        }
        
        public static void printArray(int[] array) {
            System.out.print("{");
            int len=array.length;
            for (int i = 0; i < len; i++) {
                System.out.print(array[i]);
                if (i < len - 1) {
                    System.out.print(", ");
                }
            }
            System.out.println("}");
        }
        
        public static void mergeSort(int[] data,int first,int last,int[] tmp){
            if(first<last){
                int mid = (last-first)/2+first;
                //使左侧有序
                mergeSort(data,first,mid,tmp);
                //使右侧有序
                mergeSort(data,mid+1,last,tmp);
                //合并两个有序的子序列
                mergeTwo(data, first, mid, last, tmp);
            }
        }
        
        public static void mergeTwo(int[] data,int first,int mid,int last,int[] tmp) {
            int i = first, j = mid + 1; 
            int m = mid,   n = last;  
            int k = 0; 
            
            while(i <= m && j <= n){
                
                if(data[i]<data[j]){
                    tmp[k++] =data[i++];
                }else{
                    //如果B序列值小,就将其移值tmp中
                    //并且B下标i+1;tmp下标k+1
                    tmp[k++] = data[j++];
                }
            }
            
            while(i<=m){
                tmp[k++] =data[i++];
            }
            
            while(j<=n){
                tmp[k++] = data[j++];
            }
            
            for (i = 0; i < k; i++)  {
                data[first + i] = tmp[i]; 
            }
            
        }
    }
    
    1. 输出结果


      02.png

    相关文章

      网友评论

          本文标题:Android 算法之排序算法(归并排序)

          本文链接:https://www.haomeiwen.com/subject/vdvqvltx.html