首页
随机
最近更改
特殊页面
社群首页
参数设置
关于WHY42
免责声明
WHY42
搜索
用户菜单
登录
欢迎来到Riguz的小站!这是一个私人wiki,用来记录一些我的笔记。
查看“︁Merge sort”︁的源代码
←
Merge sort
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[Image:Merge_sort_animation2.gif|right|frame|对一个随机点的链表进行排序]] 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。 =算法描述= #申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 #设定两个指针,最初位置分别为两个已经排序序列的起始位置 #比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 #重复步骤3直到某一指针到达序列尾 #将另一序列剩下的所有元素直接复制到合并序列尾 =示例代码= ==Python== <source lang="python"> def merge_sort(lst): if len(lst) <= 1: return lst def merge(left, right): merged = [] while left and right: merged.append(left.pop(0) if left[0] <= right[0] else right.pop(0)) while left: merged.append(left.pop(0)) while right: merged.append(right.pop(0)) return merged middle = int(len(lst) / 2) left = merge_sort(lst[:middle]) right = merge_sort(lst[middle:]) return merge(left, right) </source> ==Java== <source lang="java"> public static int[] mergeSort(int[] arr){//归并排序 --递归 if(arr.length==1){ return arr; } int half = arr.length/2; int[] arr1 = new int[half]; int[] arr2 = new int[arr.length-half]; System.arraycopy(arr, 0, arr1, 0, arr1.length); System.arraycopy(arr, half, arr2, 0, arr2.length); arr1 = mergeSort(arr1); arr2 = mergeSort(arr2); return mergeSortSub(arr1,arr2); } private static int[] mergeSortSub(int[] arr1,int[] arr2){//归并排序子程序 int[] result = new int[arr1.length+arr2.length]; int i = 0; int j = 0; int k = 0; while(true){ if(arr1[i] < arr2[j]){ result[k] = arr1[i]; if(++i>arr1.length-1){ break; } }else{ result[k] = arr2[j]; if(++j>arr2.length-1){ break; } } k++; } for(;i<arr1.length;i++){ result[++k] = arr1[i]; } for(;j<arr2.length;j++){ result[++k] = arr2[j]; } return result; } </source> [[Category:Algorithm]]
返回
Merge sort
。