排序算法之归并排序

蔚落 2022-07-14 05:20 334阅读 0赞

归并排序>

之前曾经实现过堆排序,它用到了完全二叉树,但是堆的设计本身就是比较复杂的,而今天要实现的归并排序同样的也用到了完全二叉树的思想,这种思想比堆排序较为简单.

归并排序是利用归并的思想实现的排序算法.它的思路是:我们将具有n个序列的无序的数组序列两两合并排序后再合并,最终获得了一个有序的数组.

归并排序的实现也极其简单:

1).将这个数组分成两个区间.[start,mid],[mid+1,end].

2).从这两个区间中找到较小的值按照顺序放入暂存数组tmp中.

3).如果有区间中的数据没有放入暂存数组中则放入.

4).因为是将区间中较小的值放入暂存数组tmp中,所以最后tmp中的值是有序的,只需要将tmp中的值拷入数组a 中即可

Center

  1. void _MergeSort(int *a,int *tmp,int start,int end)
  2. {
  3. int mid=start+((end-start)>>1);
  4. if(start < mid)
  5. _MergeSort(a,tmp,start,mid);
  6. if(mid+1 < end)
  7. _MergeSort(a,tmp,mid+1,end);
  8. //分成两个区间 [start,mid]和[mid+1,end]
  9. int start1=start;
  10. int end1=mid;
  11. int start2=mid+1;
  12. int end2=end;
  13. int index=start;
  14. //从两个区间中选择最小的放入tmp中
  15. while (start1 <= end1 && start2 <= end2)
  16. {
  17. if(a[start1] < a[start2])
  18. tmp[index++]=a[start1++];
  19. else
  20. tmp[index++]=a[start2++];
  21. }
  22. while (start1 <= end1)
  23. {
  24. tmp[index++]=a[start1++];
  25. }
  26. while (start2 <= end2)
  27. {
  28. tmp[index++]=a[start2++];
  29. }
  30. //将tmp中的数据写入a中
  31. for (int i=start;i<index;++i)
  32. {
  33. a[i]=tmp[i];
  34. }
  35. }
  36. void MergeSort(int *a,int start,int end)
  37. {
  38. int *tmp=new int[end-start+1];
  39. _MergeSort(a,tmp,start,end);
  40. delete []tmp;
  41. }

归并排序的优化类似之前实现的快速排序的优化:当数据小于13的时候直接插入,当较大的时候用归并排序,这样就增加了归并排序的效率.

归并排序适合于外排序,它的时间复杂度为O(N*lgN).

在这里就分享结束啦~~~

发表评论

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

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

相关阅读

    相关 排序算法归并排序

    归并排序是一种基于分治思想的排序算法,它的基本思路是将原始序列划分为若干个子序列,对每个子序列进行排序,然后将排好序的子序列合并为一个大序列,最终得到排序结果。具体来说,归并排

    相关 排序算法归并排序

    归并排序 基本思想:归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使用每个子序列有

    相关 排序算法归并排序

    归并排序> 之前曾经实现过堆排序,它用到了完全二叉树,但是堆的设计本身就是比较复杂的,而今天要实现的归并排序同样的也用到了完全二叉树的思想,这种思想比堆排序较为简单.

    相关 排序算法归并排序

    归并排序是利用递归与分治思想将数据序列划分成越来越小的半子序列,在对其进行排序,最后利用递归将排好序的半子序列合并成越来越大的有序序列。 归并排序中,归 即是递归的意思,即递