zoukankan      html  css  js  c++  java
  • 排序--归并排序

    算法思想

    1,申请空间,使其大小为2个已经排序的数列之和,该空间用来存放合并后的序列。

    2,设定2个指针,最初位置为2个已经排序数列的的起始位置。

    3,比较2个指针所指向的元素,选择较小的元素放入合并空间,并移动指针到下个位置。

    4,重复步骤3,知道某一个指针到达数列尾部。

    5,将另一个数列的剩余元素全部复制到合并空间。

    归并排序原理

    归并排序具体工作原理如下(假设序列共有n个元素):

    1. 将序列每相邻两个数字进行归并操作,形成floor(n/2)个序列,排序后每个序列包含两个元素
    2. 将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素
    3. 重复步骤2,直到所有元素排序完毕

    归并排序原理代码

     1 /**
     2  *归并排序的原理Demo:
     3  * 1,申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
     4  * 2, 设定两个指针,最初位置分别为两个已经排序序列的起始位置
     5  * 3, 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
     6  * 4,重复步骤3直到某一指针达到序列尾
     7  * 5,将另一序列剩下的所有元素直接复制到合并序列尾 
     8  *
     9  */
    10 public class Merge
    11 {
    12 
    13     public static int[] mergeSort(int[] A,int[] B){
    14         //申请空间,大小等于2个已经排序的数列之和
    15         int[] C = new int[A.length+B.length];
    16         //指针i,j分别指向2个数列的起始位置。
    17         int i=0,j=0,k=0;
    18         //比较2个指针所指向的元素,将较小的元素放入到合并空间,并移动指针。
    19         while(i<A.length && j<B.length){
    20             if(A[i] < B[j])
    21                 C[k++] = A[i++];
    22             else
    23                 C[k++] = B[j++];
    24         }
    25         //将另一个序列的元素全部复制到合并空间尾部
    26         //以下2个while只会执行其中一个
    27         while(i<A.length){
    28             C[k++] = A[i++];
    29         }
    30         while(j<B.length){
    31             C[k++] = B[j++];
    32         }
    33         return C;
    34     }
    35     public static void main(String[] args)
    36     {
    37         int[] A = {1,3,5,7,9,11};
    38         int[] B = {2,4,6,8,10,12};
    39         int[] C =mergeSort(A, B);
    40         for(int i: C)
    41         {
    42             System.out.print(i+" ");
    43         }
    44     }
    45 }

    Java 实现代码

     1 public class Merge
     2 {
     3 
     4     public static void main(String[] args)
     5     {
     6         Integer[] arr = {5,3,4,6,3,1,4,6,5,36,5,44,22,88,99,5,555,3335,64,544,22333};
     7         merge(arr);
     8         for(Integer i: arr)
     9         {
    10             System.out.print(i + " ");
    11         }
    12     }
    13 
    14     @SuppressWarnings("unchecked")
    15     private static <T extends Comparable<? super T>> void merge(T[] arr)
    16     {
    17         T[] temArr = (T[])new Comparable[arr.length];
    18         mergeSort(arr, temArr, 0, arr.length - 1);
    19     }
    20 
    21     private static <T extends Comparable<? super T>> void mergeSort(T[] arr, T[] temArr, int left, int right)
    22     {
    23         if(left < right)
    24         {//递归
    25             int center = (left + right) / 2;
    26             mergeSort(arr, temArr, left, center);
    27             mergeSort(arr, temArr, center + 1, right);
    28             merge(arr, temArr, left, center + 1, right);
    29         }
    30     }
    31 
    32     private static <T extends Comparable<? super T>> void merge(T[] arr, T[] temArr, int leftPos, int rightPos, int rightEnd)
    33     {
    34         // 左边数列的最大索引
    35         int leftEnd = rightPos - 1;
    36         // 合并空间的起始索引
    37         int temPos = leftPos;
    38         // 用于复制最终数组用的左边数列的起始指针
    39         int temLeft = leftPos;
    40         // 比较2个指针所指的元素的大小,将小的赋值给临时空间对应的位置。指针移动一个位置,继续比较。直到一个数列结尾。
    41         while(leftPos <= leftEnd && rightPos <= rightEnd)
    42         {
    43             if(arr[leftPos].compareTo(arr[rightPos]) <= 0)
    44             {
    45                 temArr[temPos++] = arr[leftPos++];
    46             }
    47             else
    48             {
    49                 temArr[temPos++] = arr[rightPos++];
    50             }
    51         }
    52         // 将另外一个数列全部复制到临时空间
    53         while(leftPos <= leftEnd)
    54         {
    55             temArr[temPos++] = arr[leftPos++];
    56         }
    57         while(rightPos <= rightEnd)
    58         {
    59             temArr[temPos++] = arr[rightPos++];
    60         }
    61         // 将临时空间的值复制到对应位置的原来数组
    62         for(int i = temLeft; i <= rightEnd; i++)
    63         {
    64             arr[i] = temArr[i];
    65         }
    66     }
    67 }
  • 相关阅读:
    js 点击列表li,获得当前li的id
    PHP松散比较与严格比较的区别详解
    电赛总结(二)——AD芯片总结之AD7705
    C++Premer Plus学习(五)——函数探幽
    FPGA学习
    AD7715
    电赛初探(二)——语音采集回放系统
    MATLAB信号与系统分析(五)——连续时间信号的频谱分析
    MATLAB信号与系统分析(四)——离散信号与系统的复频域分析及MATLAB实现
    MATLAB信号与系统分析(三)——连续信号与系统的复频域分析及MATLAB实现
  • 原文地址:https://www.cnblogs.com/wangziqiang/p/3613564.html
Copyright © 2011-2022 走看看