当前位置:   article > 正文

数据结构排序算法——归并排序_数据结构归并排序算法

数据结构归并排序算法

今天为大家介绍的是排序算法的归并排序(Merge Sort)

一、算法简介:

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

  1. def mergeSort(arr):
  2. import math
  3. if(len(arr)<2):
  4. return arr
  5. middle = math.floor(len(arr)/2)
  6. left, right = arr[0:middle], arr[middle:]
  7. return merge(mergeSort(left), mergeSort(right))
  8. def merge(left,right):
  9. result = []
  10. while left and right:
  11. if left[0] <= right[0]:
  12. result.append(left.pop(0))
  13. else:
  14. result.append(right.pop(0));
  15. while left:
  16. result.append(left.pop(0))
  17. while right:
  18. result.append(right.pop(0));
  19. return result

 JAVA

  1. public class MergeSort implements IArraySort {
  2. @Override
  3. public int[] sort(int[] sourceArray) throws Exception {
  4. // 对 arr 进行拷贝,不改变参数内容
  5. int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
  6. if (arr.length < 2) {
  7. return arr;
  8. }
  9. int middle = (int) Math.floor(arr.length / 2);
  10. int[] left = Arrays.copyOfRange(arr, 0, middle);
  11. int[] right = Arrays.copyOfRange(arr, middle, arr.length);
  12. return merge(sort(left), sort(right));
  13. }
  14. protected int[] merge(int[] left, int[] right) {
  15. int[] result = new int[left.length + right.length];
  16. int i = 0;
  17. while (left.length > 0 && right.length > 0) {
  18. if (left[0] <= right[0]) {
  19. result[i++] = left[0];
  20. left = Arrays.copyOfRange(left, 1, left.length);
  21. } else {
  22. result[i++] = right[0];
  23. right = Arrays.copyOfRange(right, 1, right.length);
  24. }
  25. }
  26. while (left.length > 0) {
  27. result[i++] = left[0];
  28. left = Arrays.copyOfRange(left, 1, left.length);
  29. }
  30. while (right.length > 0) {
  31. result[i++] = right[0];
  32. right = Arrays.copyOfRange(right, 1, right.length);
  33. }
  34. return result;
  35. }
  36. }

C

  1. int min(int x, int y) {
  2. return x < y ? x : y;
  3. }
  4. void merge_sort(int arr[], int len) {
  5. int *a = arr;
  6. int *b = (int *) malloc(len * sizeof(int));
  7. int seg, start;
  8. for (seg = 1; seg < len; seg += seg) {
  9. for (start = 0; start < len; start += seg * 2) {
  10. int low = start, mid = min(start + seg, len), high = min(start + seg * 2, len);
  11. int k = low;
  12. int start1 = low, end1 = mid;
  13. int start2 = mid, end2 = high;
  14. while (start1 < end1 && start2 < end2)
  15. b[k++] = a[start1] < a[start2] ? a[start1++] : a[start2++];
  16. while (start1 < end1)
  17. b[k++] = a[start1++];
  18. while (start2 < end2)
  19. b[k++] = a[start2++];
  20. }
  21. int *temp = a;
  22. a = b;
  23. b = temp;
  24. }
  25. if (a != arr) {
  26. int i;
  27. for (i = 0; i < len; i++)
  28. b[i] = a[i];
  29. b = a;
  30. }
  31. free(b);
  32. }

四、归并排序算法性质简介:

最好时间复杂度

最坏时间复杂度

平均时间复杂度

空间复杂度

稳定性

传统归并排序

O(nlogn)

O(nlogn)

O(nlogn)

T(n)

稳定

改进归并排序 [1] 

O(n)

O(nlogn)

O(nlogn)

T(n)

稳定

TimSort

O(n)

O(nlogn)

O(nlogn)

T(n)

稳定

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/866202
推荐阅读
相关标签
  

闽ICP备14008679号