一头扎进算法导论-归并排序

系统管理员 2022-07-16 10:48 268阅读 0赞

定义:归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

用自己的话说:使用递归,把一数组分为两个子数组,再分为四个子数组…,直到子数组的个数为2时开始层层向上归并,最后得到排序好的数组

过程:
这里写图片描述

代码:

  1. public int[] sort(int[] a,int start,int end){
  2. //输入开始坐标从0开始,和结束坐标
  3. int mid = (start+end)/2;//求中间坐标,奇数则取中间,偶数则取中间两个小的那个的坐标
  4. if(start<end){
  5. //如果开始坐标小于结束坐标,开始递归
  6. sort(a, start, mid);//从开始到中间
  7. sort(a, mid+1, end);//从中间右边一个开始到结束
  8. merger(a,start,mid,end);//归并
  9. }
  10. return a;
  11. }
  12. private void merger(int[] a, int start, int mid, int end) {
  13. //开始坐标,中间坐标,结束坐标
  14. int l = start;//左边开始坐标
  15. int r = mid+1;//右边开始坐标
  16. int[] temp = new int[end-start+1];//定义一个缓存数组
  17. int tk = 0;//指向缓存数组的当前坐标
  18. while(l<=mid&&r<=end){
  19. //开始判断,左边或者右边一边遍历完了就退出
  20. if(a[l]<a[r]){
  21. temp[tk] = a[l];//小的进入数组
  22. tk++;
  23. l++;
  24. }else{
  25. temp[tk] = a[r];
  26. tk++;
  27. r++;
  28. }
  29. }
  30. //把另一方未遍历的进行遍历填充
  31. while(l<=mid){
  32. temp[tk] = a[l];
  33. tk++;
  34. l++;
  35. }
  36. while(r<=end){
  37. temp[tk] = a[r];
  38. tk++;
  39. r++;
  40. }
  41. System.out.println("before merger :" + Arrays.toString(a));
  42. System.out.println("temp array :" + Arrays.toString(temp));
  43. //把遍历好的数组放进原数组
  44. for(int i=0;i<temp.length;i++){
  45. a[i+start] = temp[i];
  46. }
  47. System.out.println("after merger :" + Arrays.toString(a));
  48. System.out.println("--------------------------");
  49. }

测试:

  1. public static void main(String[] args){
  2. int[] a= new int[]{
  3. 5,8,3,4,7,2,7,4};
  4. a = new Merger().sort(a, 0, a.length-1);
  5. for(int i : a){
  6. System.out.print(i+",");
  7. }
  8. }

结果:

  1. before merger :[5, 8, 3, 4, 7, 2, 7, 4]
  2. temp array :[5, 8]
  3. after merger :[5, 8, 3, 4, 7, 2, 7, 4]
  4. -------------------------- before merger :[5, 8, 3, 4, 7, 2, 7, 4] temp array :[3, 4] after merger :[5, 8, 3, 4, 7, 2, 7, 4] --------------------------
  5. before merger :[5, 8, 3, 4, 7, 2, 7, 4]
  6. temp array :[3, 4, 5, 8]
  7. after merger :[3, 4, 5, 8, 7, 2, 7, 4]
  8. -------------------------- before merger :[3, 4, 5, 8, 7, 2, 7, 4] temp array :[2, 7] after merger :[3, 4, 5, 8, 2, 7, 7, 4] --------------------------
  9. before merger :[3, 4, 5, 8, 2, 7, 7, 4]
  10. temp array :[4, 7]
  11. after merger :[3, 4, 5, 8, 2, 7, 4, 7]
  12. -------------------------- before merger :[3, 4, 5, 8, 2, 7, 4, 7] temp array :[2, 4, 7, 7] after merger :[3, 4, 5, 8, 2, 4, 7, 7] --------------------------
  13. before merger :[3, 4, 5, 8, 2, 4, 7, 7]
  14. temp array :[2, 3, 4, 4, 5, 7, 7, 8]
  15. after merger :[2, 3, 4, 4, 5, 7, 7, 8]
  16. -------------------------- 2,3,4,4,5,7,7,8,

发表评论

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

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

相关阅读

    相关 一头算法导论-冒泡排序

    定义:交换排序的基本思想是,通过比较两个记录键值的大小,如果这两个记录键值的大小出现逆序,则交换这两个记录,这样将键值较小的记录向序列前部移动,键值较大的记录向序列后部移动。假

    相关 一头算法导论-插入排序

    定义:直接插入排序是一种简单的排序方法,她的基本思想是依次将每个记录插入到一个已排好序的有序表中去,从而得到一个新的、记录数增加1的有序表,就好比斗地主抓牌排序的这么一个过程