归并排序(Merge Sort)

谁践踏了优雅 2022-06-11 09:27 260阅读 0赞

归并排序(Merge Sort)是建立在归并操作上的一种有效的排序算法,效率为O(n log n);该算法是采用分治法一种典型的应用,且各层分治递归可以同时进行。

归并排序的基本思路是

  • 将序列每相邻两个数字进行归并操作,形成n/2个序列,排序后每个序列包含两个元素;
  • 将上述序列再次归并,形成n/4个序列,每个序列包含四个元素;
  • 重复步骤2,直到所有元素排序完毕;

这里写图片描述

这里写图片描述

要理解归并算法首先要理解归并操作(Merge),归并操作(Merge)也叫归并算法,指的是将两个已经排好的序列合并成一个序列的操作;归并算法依赖于归并操作。

使用C语言实现一个数组的左右两部分有序数列的归并操作,即将左右两部分看成两个有序数列合并成一个有序数列

  1. //a[]是要进行排序的数组,first、mid、last分别代表左侧有序部分数组的起始位置,
  2. //左右有序两部分的分界点,右侧有序部分的终点,
  3. //tmp[]是大小为last-first的数组,用于临时存放排序的数列
  4. void mergeArray(int a[],int first,int mid,int last,int tmp[]) {
  5. int i = first;
  6. int j = mid+1;
  7. int k = 0; //K用作tmp[]的索引
  8. //将a[]左右有序的两部分按照由小到大的顺序存入tmp[]中
  9. while (i<=mid&&j<=last)
  10. a[i] < a[j] ? tmp[k++] = a[i++] : tmp[k++] = a[j++];
  11. while (i <= mid)
  12. tmp[k++] = a[i++];
  13. while (j <= last)
  14. tmp[k++] = a[j++];
  15. while (k > 0)
  16. a[--j] = tmp[--k];
  17. }
  18. void mergeSort(int a[],int first,int last,int tmp[]) {
  19. if (first<last)
  20. {
  21. int mid = (first + last) / 2;
  22. mergeSort(a,first,mid,tmp); //左边有序
  23. mergeSort(a, mid+1, last, tmp);//右边有序
  24. mergeArray(a,first,mid,last,tmp); //将两个数组合并
  25. }
  26. }
  27. ````
  28. 有序数组的归并以及归并排序的测试
  29. <div class="se-preview-section-delimiter"></div>
  30. ```c
  31. int main() {
  32. int a[7] = {
  33. 7,8,9,10,1,2,3};
  34. int tmp[7];
  35. printf("测试数组归并\n");
  36. mergeArray(a, 1, 3, 5, tmp);
  37. for (int i = 0; i < 7; i++)
  38. {
  39. printf("%d\n", a[i]);
  40. }
  41. printf("测试数组归并排序\n");
  42. mergeSort(a,0,6,tmp);
  43. for (int i = 0; i < 7; i++)
  44. {
  45. printf("%d\n", a[i]);
  46. }
  47. system("pause");
  48. return 0;
  49. }

发表评论

表情:
评论列表 (有 0 条评论,260人围观)

还没有评论,来说两句吧...

相关阅读

    相关 归并排序merge sort

    归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。(出自[维基百科][Li