排序-6-归并排序

来源:互联网 发布:淘宝的芦荟胶是真的吗 编辑:程序博客网 时间:2024/06/06 21:19

递归排序:

package myDataStructrueADNDalgorith.three.arrSort;import java.awt.image.renderable.RenderableImage;import javax.swing.text.AbstractDocument.LeafElement;/* * 递归归并排序: *      思路:把数组递归均分为两半,根据数组元素的个数有两种情况, *          一:元素个数为偶数,刚好递归均分后分为两组数组中相邻的两个元素,比喻下标为0,1调用merge函数(因为Lbegin为0,REnd为1, *              所以mid=0故在无法均分,结束均分) 和下标为2,3调用merge函数(同理)。 *              调用merge函数后,左半部分和右半部分元素个数都为1,故当作有序,将左半部分和右半部份合成有序,完成一组的排序,另一组同理。 *              在完成后将两组中前一组当作左半部分,后一组当作右半部份,同理完成排序。 *          二:元素个数为基数,必然分成两组,一组含有两个元素同上面的第一种情况,和一组只含有一个元素,故这一组本身就是有序。 *              故剩下的同上面第一种情况 *  * 思路的简述:将数组递归对半均分,均分到不能再均分(每一个对半的元素中只含有一个元素或两个元素), * 将每一个对半进行左半部分和右半部份的排序, *          后将每一个均分同样按照左半部分和右半部份排序...一次递归。 *          左半部分和右半部份排序:遍历次数为左半部分和右半部份的总长度,一次从两个部分最左边取数据比较大小,按照排序要求选取,选取后选取那一半的最左边下标+1 */public class DiGuiMergeSort {    static int order[];    public static void main(String[] args) {//      int arr[] ={7,5,2,1,3,4,6,9,8,10,12,13,15,19,11,14,16,20};        int arr[] ={7,5,2,1,3};        order = new int[arr.length];        DiGuiMergeSort.sort(arr, 0,(arr.length-1));        Example.show(arr);    }    /*     * arr[]:数组     * LBegin:数组的左开始下标     * REnd:数组的右结束下标     * 给函数的作用是将数组arr[], (将数组按数组大小分成两个数组,调用merge方法)--并将括号中的内容递归调用     */    public static void sort(int arrSort[],int LBegin,int REnd){        if(LBegin >= REnd)return;//如果左边下标大于或等于数组的右下标说明数组已经分割成单个数组,或有问题了        int mid = (REnd + LBegin ) / 2 ;        DiGuiMergeSort.sort(arrSort,LBegin,mid);        DiGuiMergeSort.sort(arrSort, mid+1, REnd);        DiGuiMergeSort.merge(arrSort, LBegin, REnd, mid);    }    /*     * 因为最开始传递过来的数组arrMerge之后是1一个元素,故是有序的,合并后,数组的个数是2个,也是有序的     * 所以merge方法只考虑数组下标LBegin->LEnd(有序) 和 RBegin-->到REnd(有序)的情况下如何弄成下标LBegin-->REnd有序     *      */    public static void merge(int[] arrMerge,int LBegin,int REnd,int LEnd){        int RBegin = LEnd + 1;        for(int i = LBegin;i <= REnd;i++){            order[i] = arrMerge[i];        }        for(int i = LBegin;i <= REnd;i++){            if(LBegin > LEnd){                arrMerge[i]=order[RBegin++];//表示左边的数都添加到了arrMerge中            }else if(RBegin > REnd){                    arrMerge[i] = order[LBegin++];//表示右边的数都添加到arrMerge中            }else if(order[LBegin] < order[RBegin]){                arrMerge[i] = order[LBegin++];            }else{                arrMerge[i] = order[RBegin++];            }        }    }}
原创粉丝点击