赞
踩
一、算法简介:
1、归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。
2、归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
3、归并排序分为两种:从上到下排序和从下到上排序。
(1). 从下往上的归并排序:将待排序的数列分成若干个长度为1的子数列,然后将这些数列两两合并;得到若干个长度为2的有序数列,再将这些数列两两合并;得到若干个长度为4的有序数列,再将它们两两合并;直接合并成一个数列为止。这样就得到了我们想要的排序结果。(参考下面的图片)
(2). 从上往下的归并排序:它与"从下往上"在排序上是反方向的。它基本包括3步:
① 分解 -- 将当前区间一分为二,即求分裂点 mid = (low + high)/2;
② 求解 -- 递归地对两个子区间a[low...mid] 和 a[mid+1...high]进行归并排序。递归的终结条件是子区间长度为1。
③ 合并 -- 将已排序的两个子区间a[low...mid]和 a[mid+1...high]归并为一个有序的区间a[low...high]。
两者排序算法的区别如图所示:
二、归并排序算法动态图演示:
三、归并排序算法代码展示:
Python
- def mergeSort(arr):
- import math
- if(len(arr)<2):
- return arr
- middle = math.floor(len(arr)/2)
- left, right = arr[0:middle], arr[middle:]
- return merge(mergeSort(left), mergeSort(right))
-
- def merge(left,right):
- result = []
- while left and right:
- if left[0] <= right[0]:
- result.append(left.pop(0))
- else:
- result.append(right.pop(0));
- while left:
- result.append(left.pop(0))
- while right:
- result.append(right.pop(0));
- return result

JAVA
- public class MergeSort implements IArraySort {
-
- @Override
- public int[] sort(int[] sourceArray) throws Exception {
- // 对 arr 进行拷贝,不改变参数内容
- int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
-
- if (arr.length < 2) {
- return arr;
- }
- int middle = (int) Math.floor(arr.length / 2);
-
- int[] left = Arrays.copyOfRange(arr, 0, middle);
- int[] right = Arrays.copyOfRange(arr, middle, arr.length);
-
- return merge(sort(left), sort(right));
- }
-
- protected int[] merge(int[] left, int[] right) {
- int[] result = new int[left.length + right.length];
- int i = 0;
- while (left.length > 0 && right.length > 0) {
- if (left[0] <= right[0]) {
- result[i++] = left[0];
- left = Arrays.copyOfRange(left, 1, left.length);
- } else {
- result[i++] = right[0];
- right = Arrays.copyOfRange(right, 1, right.length);
- }
- }
-
- while (left.length > 0) {
- result[i++] = left[0];
- left = Arrays.copyOfRange(left, 1, left.length);
- }
-
- while (right.length > 0) {
- result[i++] = right[0];
- right = Arrays.copyOfRange(right, 1, right.length);
- }
-
- return result;
- }
-
- }

C
- int min(int x, int y) {
- return x < y ? x : y;
- }
- void merge_sort(int arr[], int len) {
- int *a = arr;
- int *b = (int *) malloc(len * sizeof(int));
- int seg, start;
- for (seg = 1; seg < len; seg += seg) {
- for (start = 0; start < len; start += seg * 2) {
- int low = start, mid = min(start + seg, len), high = min(start + seg * 2, len);
- int k = low;
- int start1 = low, end1 = mid;
- int start2 = mid, end2 = high;
- while (start1 < end1 && start2 < end2)
- b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
- while (start1 < end1)
- b[k++] = a[start1++];
- while (start2 < end2)
- b[k++] = a[start2++];
- }
- int *temp = a;
- a = b;
- b = temp;
- }
- if (a != arr) {
- int i;
- for (i = 0; i < len; i++)
- b[i] = a[i];
- b = a;
- }
- free(b);
- }

四、归并排序算法性质简介:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。