归并排序(mergeSort)

合并排序,算法思想:就是将这个待排序的序列划分为两个序列,然后再利用递归分别对这两个序列再次进行划分直到划分到每组只有一个元素,然后进行合并排序。

 

以数组myarr = {8,4,5,7,1,3,6,2}为例子。

首先进行划分一分为二,划分为8457 1362 两个序列。

  

 

 然后递归将这两个序列继续划分。划分为如下图所示,每个组中有两个元素还可以继续划分。

   

 

 继续划分

             

 

 现在每组中只有一个元素无法再次进行划分,接下来我们就行开始进行排序。

首先是元素8,它自己一组不需要进行比较,然后是元素4同理。接着对元素8和元素4进行合并排序

  

 

将其合并成一个新的有序序列,其他类似。

     

 

接着对48 和57 这个两组进行合并排序结果如下

 

 同理对13 和 26进行排序,最后得到两个有序的序列 4578和 1236

 

 最后只需要对这两组序列进行合并排序就可以得到我们所需要排序的结果。

 

 

 合并序列时的步骤,以48 和 57 这两个序列为例子,首先将4 和 5 进行比较,4比5小将其放入一个新的临时序列进行存储,接着将下标移动的8让其与5进行比较,由于5与8小将5放入新的序列。继续移动下标,将8与7进行比较将7放入新的临时序列

这时候右边的序列即57已经排序完了,只剩下左边的元素接下来只要将剩下的元素依次放入到新序列就可以了。这样新的序列里面的元素就是4578,最后想新序列中的元素拷贝到原来数组就完成了一次合并。

 

代码展示

package demo;

import java.util.Arrays;

public class TestMergeSort {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] myarr = new int[] {5,3,2,7,8,1,2,0,4,7,4,3,8};
        System.out.println(Arrays.toString(myarr));
        mergeSort(myarr, 0, myarr.length-1);

        System.out.println(Arrays.toString(myarr));
    }
    //
    public static void mergeSort(int[] myarr, int left, int right) {
        int middle = (left + right) /2;
        //递归结束的条件左边下标的值大于或者等于右边下标的值
        if(left < right) {
            mergeSort(myarr, left, middle);
            mergeSort(myarr, middle+1, right);
            merge(myarr, left, middle, right);
        }
    
    }
    
    
    //排序
    public static void merge(int[] myarr, int left, int middle, int right) {
        int[] temp = new int[right-left+1];
        int index =0,i = left,j = middle+1;
        //将两个序列进行比较
        while(i<=middle && j<=right) {
            if(myarr[i] < myarr[j]) {
                temp[index] = myarr[i];
                i++;
            }
            else {
                temp[index] = myarr[j];
                j++;
            }
            index++;
            
        }
        //右边序列的元素已经全部进入新的序列,剩下的左边序列的元素
        while(i<=middle) {
            temp[index] = myarr[i];
            i++;
            index++;
            }
        //左边序列的元素已经全部进入新的序列,剩下的右边序列的元素
        while(j<= right) {
            temp[index] = myarr[j];
            j++;
            index++;
        }
        //将新序列中的元素拷贝到原来数组中
        for(int k=0; k<temp.length; k++) {
            myarr[left+k] = temp[k];
            
        }
    }

}

 

 

 

 

  

 

 

 

 

  

  

  

  

 

posted @ 2019-09-28 22:02  RenJian666  阅读(445)  评论(0)    收藏  举报