首页 > 编程语言 > 详细

排序篇--归并排序

时间:2021-08-10 23:26:50      阅读:25      评论:0      收藏:0      [点我收藏+]
算法描述:
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
 
动画演示:
技术分享图片

 

 

实现逻辑:
把长度为n的输入序列分成两个长度为n/2的子序列;
对这两个子序列分别采用归并排序;
将两个排序好的子序列合并成一个最终的排序序列。
 
代码实现
(插入排序;时间A:N*logN,B:N*logN,E:N*logN;空间N;稳定)
/*
归并排序内部缓存法 可以把空间复杂度降到O(1);
归并排序原地归并法 也可以把空间复杂度降到O(1)但是时间复
杂度会变成O(N^2)
*/
//合并解
void merge(int* p, int first,int mid,int end)
{
        int *temp = new int[end - first + 1]();
        int left_first = first;
        int left_end = mid;
        
        int right_first = mid + 1;
        int right_end = end;
        int k = 0;
        //依次比较两个数组的大小 将较小的放入临时数组
        for (k = 0; left_first <= left_end&&right_first <= right_end; k++)
        {
               if (p[left_first] <= p[right_first])
               {
                       temp[k] = p[left_first];
                       left_first++;
               }
               else
               {
                       temp[k] = p[right_first];
                       right_first++;
               }
        }
        //左边剩余元素 复制到temp中
        if (left_first <= left_end)
        {
               for (int j = left_first; j <= left_end; j++)
               {
                       temp[k] = p[j];
                       k++;    
               }
               
        }
        //右边剩余元素 复制到temp中
        if (right_first <= right_end)
        {
               for (int j = right_first; j <= right_end; j++)
               {
                       temp[k] = p[j];
                       k++;
               }
        }
        //拷贝到原来的数组中
        for (int i = 0; i <end-first+1; i++)
        {
               p[first+i] = temp[i];
        }
        
        delete []temp;
        
}
//归并
void merge_sort(int* p,int first,int end)
{
        int mid = 0;
        if (first<end)
        {
               mid = (first + end )/2;   //分的阶段  将大数组分解成小数组
               merge_sort(p, first, mid);
               merge_sort(p, mid + 1, end);
               merge(p, first, mid, end);//治的阶段  将小数组合并成大数组
        }
}

 

排序篇--归并排序

原文:https://www.cnblogs.com/zhang-liubai/p/15125911.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!