算法 —— 归并排序

原理:
          归并排序是建立在归并操作上的一种排序算法,将两个(或两个以上)的有序表合成一个新的有序表,即把待排序列分为若干个子序列,每个子序列都是有序的。然后再把有序子序列合并为新的整体有序序列。
          归并算法的核心: 先分解,再合并
          如何让数组内的数据有序?
          可以将A、B两组数据内部再进行数据分组,直到每个小组只有一个数据,可以认为小组组内的数据已经达到了有序,然后再合并相邻的两个小组。这样通过递归的分解数列,可以使 A 、B两个组内数据达到有序,然后再合并 A、 B两组数据。这样就完成了归并排序。
          
代码:
      void mergeSortSelector( int arr[], int first, int end, int temp[])
{
   
if (first < end) {
       
int mid = (first + end) / 2 ;
       
mergeSortSelector (arr,first,mid,temp);
       
mergeSortSelector (arr, mid + 1 , end,temp);
       
mergeSortArray (arr, first, mid, end,temp);
    }
}
void mergeSortArray ( int arr[], int first, int mid, int end, int temp[])
{
   
int i = first,j = mid + 1 ,k = 0 ;
   
int m = mid  ,n = end;
   
while (i <= m && j <= n) {
       
if (arr[i] >= arr[j]) {
            temp[k] = arr[j];
            j ++;
            k ++;
        }
       
else
        {
            temp[k] = arr[i];
            k ++;
            i ++;
        }
    }
   
while (i <= m) {
        temp[k] = arr[i];
        k ++;
        i ++;
    }
   
while (j <= n) {
        temp[k] = arr[j];
        k ++;
        j ++;
    }
   
   
for (i = 0 ; i < k; i ++) {
        arr[first + i] = temp[i];
    }
}


     为了达到最大效率的排序,临时数组 temp 只new 了一次,即只占用了一块内存,避免了多次生成temp ,分配内存造成的时间浪费。     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值