归并排序

来源:互联网 发布:百度输入法linux版 编辑:程序博客网 时间:2024/06/10 10:53

一.基本思想

归并(Merge)排序法是将待排序序列分为若干个子序列,对每个子序列进行排序,然后再把有序子序列合并为整体有序序列。

二.归并排序示例

这里写图片描述

三.归并排序的Java实现

    /**     * 归并排序     * @param array     */    public static void mergeSort(int[] array){        sort(array,0,array.length-1);    }    /**     * 排序     * @param array     * @param left     * @param right     */    public static void sort(int[] array, int left, int right){        if(left >= right){            return; //递归出口        }        //分割        int mid = (left+right)/2;        sort(array,left,mid);        sort(array,mid+1,right);        //合并        merge(array,left,mid,right);        printArray(array);    }    /**     * 合并     * @param array     * @param left     * @param mid     * @param right     */    public static void merge(int[] array, int left, int mid, int right){        int[] tempArr = new int[array.length];  //临时数组,存储排序好的数组        int index=left;//临时数组的下标        int center = mid+1;//右边第一个元素的下标        int first = left;//缓存数组第一个元素的下标        while(left<=mid && center<=right){            if(array[left] < array[center]){                tempArr[index++] = array[left++];            }else{                tempArr[index++] = array[center++];            }        }        //将剩余的部分放入数组,下面的两个while只有执行其中一个        while(left<=mid){            tempArr[index++] = array[left++];        }        while(center<=right){            tempArr[index++] = array[center++];        }//      //将临时数组的内容拷贝到需要排序的数组中        while(first<=right){            array[first] = tempArr[first++];        }    }

四.效率

O(nlgn)

五.应用场景

适用与外部排序。
外部排序:指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。

1 0