归并排序(merge sort)

女爷i 2022-03-29 06:12 337阅读 0赞

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








平均时间复杂度 \Theta(n\log n)

Conceptually ,归并算法的基本步骤如下所示:

1)使用递归(recursion)方法把未排序的序列分成n个子序列,每个子序列只包含一个元素(一个元素被认为是有序的);

 2)使用归并操作重复合并子序列产生新的序列,直到只剩下一个序列,那么这个序列就是有序的。

归并操作(merge) ,也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。归并排序算法依赖归并操作。

归并操作算法描述

归并操作的过程如下:

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 重复步骤3直到某一指针达到序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾

代码实现

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. void mergeSort(int arr[], int left, int right);
  4. void Merge(int arr[], int left, int middle, int right);
  5. int main()
  6. {
  7. int i;
  8. int arr[]={
  9. 5,2,6,3,9,10,8};
  10. int len = sizeof(arr)/sizeof(int);
  11. mergeSort(arr,0,len-1);
  12. for (i = 0; i <= len-1; i++)
  13. {
  14. printf("%3d",arr[i]);
  15. }
  16. return 0;
  17. }
  18. void mergeSort(int arr[], int left, int right)
  19. { //对数组进行迭代排序
  20. int middle;
  21. if(left >= right) return;
  22. middle = (left + right)/2;
  23. mergeSort(arr,left,middle);
  24. mergeSort(arr,middle+1,right);
  25. Merge(arr,left,middle,right);
  26. }
  27. void Merge(int arr[], int left, int middle, int right)
  28. { //归并操作
  29. int length = right - left + 1;
  30. int *pArr;
  31. int beginA = left,beginB = middle + 1; //设置两个标志,分别指向两个已排序序列的起始位置
  32. int nCount = 0,i;
  33. pArr = (int *)malloc(sizeof(int)*length); //开辟空间
  34. if (pArr == NULL)
  35. {
  36. printf("malloc error\n");
  37. return;
  38. }
  39. while (beginA <= middle)
  40. {
  41. if (arr[beginA] > arr[beginB])
  42. {
  43. pArr[nCount++] = arr[beginB++];
  44. }
  45. if (arr[beginA] < arr[beginB])
  46. {
  47. pArr[nCount++] = arr[beginA++];
  48. }
  49. if (beginB > right) break;
  50. }
  51. while (beginA <= middle)
  52. {
  53. pArr[nCount++] = arr[beginA++];
  54. }
  55. while (beginB <= right)
  56. {
  57. pArr[nCount++] = arr[beginB++];
  58. }
  59. for (i = 0; i < length; i++) //把排序好的部分移回arr数组中
  60. {
  61. arr[left++] = pArr[i];
  62. }
  63. free(pArr);
  64. }
  65. 2013/6/15 12:34

发表评论

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

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

相关阅读

    相关 归并排序merge sort

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