排序算法整理之归并排序

来源:互联网 发布:股权投资成功率数据 编辑:程序博客网 时间:2024/06/14 09:46

归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

归并操作的过程如下:

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

2.        设定两个指针,最初位置分别为两个已经排序序列的起始位置

3.        比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

4.        重复步骤3直到某一指针达到序列尾

5.        将另一序列剩下的所有元素直接复制到合并序列尾

 

图:

归并排序中中两件事情要做:

第一:“分”,就是将数组尽可能的分,一直分到原子级别。

第二:“并”,将原子级别的数两两合并排序,最后产生结果。

代码实现:

public class MergeSort {/*** * 数组的划分 *  * @param array 待排序数组 * @param temparray 临时存放数组 * @param left 序列段的开始位置 * @param right 序列段的开始位置 */public static void mergeSort(int[] array, int[] temparray, int left,int right) {if (left < right) {// 取分割位置int middle = (left + right) / 2;// 递归划分数组左序列mergeSort(array, temparray, left, middle);// 递归划分数组右序列mergeSort(array, temparray, middle + 1, right);// 数组合并操作merge(array, temparray, left, middle + 1, right);}}/*** * 数组的两两合并操作 *  * @param array 待排序数组 * @param temparray 临时数组 * @param left 第一个区间段开始位置 * @param middle 第二个区间的开始位置 * @param right 第二个区间段结束位置 */public static void merge(int[] array, int[] temparray, int left,int middle, int right) {// 左指针尾int leftEnd = middle - 1;// 右指针头int rightStart = middle;// 临时数组的下标int tempIndex = left;// 数组合并后的length长度int tempLength = right - left + 1;// 先循环两个区间段都没有结束的情况while ((left <= leftEnd) && (rightStart <= right)) {// 如果发现有序列大,则将此数放入临时数组if (array[left] < array[rightStart])temparray[tempIndex++] = array[left++];elsetemparray[tempIndex++] = array[rightStart++];}// 判断左序列是否结束while (left <= leftEnd)temparray[tempIndex++] = array[left++];// 判断右序列是否结束while (rightStart <= right)temparray[tempIndex++] = array[rightStart++];// 交换数据for (int i = 0; i < tempLength; i++) {array[right] = temparray[right];right--;}}/** * @param args */public static void main(String[] args) {int[] array = {2,5,1,8,9,3};System.out.println("排序前:"+Arrays.toString(array));mergeSort(array, new int[array.length], 0, array.length - 1);System.out.println("排序后:"+Arrays.toString(array));}}


 

输出结果:

排序前:[2, 5, 1, 8, 9, 3]

排序后:[1, 2, 3, 5, 8, 9]

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 单位社保发票丢失怎么办 单位医保发票丢失怎么办 图书明细没有给怎么办 拼音拼不到一起怎么办 孩子不会拼拼音怎么办 小孩子不会拼拼音怎么办 小孩拼音发音不准怎么办 孩子声调不会标怎么办 孩子拼音发音不准怎么办 孩子学拼音不会怎么办? 孩子不会拼生字怎么办? 对数字不敏感怎么办 孩子说话不算数怎么办 儿童做事不认真怎么办 幼儿园小朋友爱打人怎么办 遇到熊孩子家长怎么办 小孩嘴烂了怎么办 孩子杯宠坏了怎么办 小孩子老爱打人怎么办 小孩偏执的性格怎么办 孩子上学爱打人怎么办 宝宝爱动手打人怎么办 幼儿爱打人教师怎么办 中班幼儿爱打人怎么办 幼儿园小班小朋友打人老师怎么办 2岁小朋友打人怎么办 幼儿爱乱讲话怎么办 幼儿园小孩打架老师怎么办 宝宝不自信胆小怎么办 小孩不尊重父母怎么办 孩子有洁癖应该怎么办 宝宝攻击性太弱怎么办 小孩在幼儿园打人怎么办 小孩说老师打人怎么办 孩子总动手打人怎么办 辅导小孩老发火怎么办 孩子喜欢咬人怎么办 小孩见家人不叫怎么办 孩子识字量差怎么办 小孩子字写不好怎么办 宝宝不好好写字怎么办