排序篇--归并排序
算法描述:
归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(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);//治的阶段  将小数组合并成大数组
        }
}
                    
                
                
            
        
浙公网安备 33010602011771号