Merge Sort (归并排序)

刺骨的言语ヽ痛彻心扉 2022-08-08 06:38 224阅读 0赞

归并排序是分治法的例子。

在归并排序中,会递归地把列表一分为2,然后进行排序,最后再合并。

归并排序中,需要使用辅助空间O(n)。

比如,要对3,5,4,9,2进行排序,我们有下图

![Image 1][]

不断地把n/2,然后进行排序和合并,程序如下所列:

  1. <pre name="code" class="java">//
  2. // main.cpp
  3. // MergeSort
  4. //
  5. // Created by Paul Huang on 15/5/10.
  6. // Copyright (c) 2015年 Paul Huang. All rights reserved.
  7. //
  8. #include <iostream>
  9. int data[5]={3,5,4,9,2};
  10. int dataaux[5];
  11. int max(int x, int y)
  12. {
  13. if(x > y)
  14. {
  15. return true;
  16. }
  17. else
  18. {
  19. return false;
  20. }
  21. }
  22. void merge( int low, int mid, int high ){
  23. int i=low;
  24. int j=mid+1;
  25. for(int k=low;k<=high;k++){
  26. dataaux[k]=data[k]; //复制数组元素到一个新数组
  27. }
  28. for(int k=low;k<=high;k++){
  29. if(i>mid) data[k]=dataaux[j++]; //左边(低位)的数组已经全部比较完,并进入比较后的结果数组
  30. else if (j>high) data[k]=dataaux[i++]; //右边(高位)的数组已经全部比较完,并进入比较后的结果数组
  31. else if(max(dataaux[i],dataaux[j])) data[k]=dataaux[j++]; //左边和右边的数组进行比较
  32. else data[k]=dataaux[i++];
  33. }
  34. }
  35. void sort(int left, int right)
  36. {
  37. if(right<=left) return;
  38. int mid=left+(right-left)/2;
  39. sort(left,mid);
  40. sort(mid+1,right);
  41. merge(left,mid,right);
  42. }
  43. int main(int argc, const char * argv[]) {
  44. // insert code here...
  45. std::cout << "Hello, World!\n";
  46. sort(0,4);
  47. for(int i=0;i<5;i++){
  48. std::cout<<data[i]<<std::endl;
  49. }
  50. return 0;
  51. }

[Image 1]:

发表评论

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

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

相关阅读

    相关 归并排序merge sort

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