深度解析插入排序与归并排序

此篇为原创,如需转载,请注明出处:http://blog.csdn.NET/qq_36759732

插入排序的基本思想是:每次将一个待排序的记录,按其关键字的大小插入到前面已经排好序的的记录序列中的恰当位置,直到全部记录插完为止。因此又称为增量法。

书本上面利用哨兵防止信息的丢失,在这儿,为了代码的简洁,我加了特判。

编程环境: vim

核心代码:

  void insert_sort(int arr[], int n){
      for(int i = 1; i < n; ++i){
        int t = i;
          while(t && arr[t] < arr[t - 1]){ // t 为特判
              swap(arr[t], arr[t - 1]);
              t--;
          }
      }
      return ;
  }


归并排序的基本思想是:把两个后两个以上的有序文件合并起来,形成一个新的有序文件,大学期间常用的是自底向上的2-路归并排序。

编程环境:vim

核心代码:

  void merge_sort_my(Data *arr, int l, int r){
        int mid = (l + r) / 2;
        if(l == r) return ; //只剩1个元素时
        if(r - l == 1){ /*还有2个元素时*/
            if(cmp_data(arr[l], arr[r])){
                swap(arr[l], arr[r]);
            }
       }
        merge_sort_my(arr, l, mid);
        merge_sort_my(arr, mid + 1, r);
        Data *temp = (Data *)malloc((l + r) *sizeof(Data));
        int index1 = 0; //指向前面数组的第一个元素
        int index2 = mid + 1; //指向后面数组的第一个元素
        int k = 0; //temp数组指针
        while(index1 <= l || index2 <= r){ //归并过程
              if(index1 > mid){ /*只剩下后面的数组[index2,r]时*/
                  temp[k++] = arr[index2++];
              }
              if(index2 > r){ /*只剩下前面的数组[index1,mid]*/
                  temp[k++] = arr[index1++];
             }
             if(cmp_data(arr[index2], arr[index1])){ //后面的第一个大于前面的第>    一个时
                 temp[k++] = arr[index1++];
             }else{
                 temp[k++] = arr[index2++];  //后面的第一个小于前面的第一个时
             }
 
       }
       for(int i = l; i <= r; ++i){
           arr[i] = temp[i]; //把temp中的元素拷贝到arr中
       }
       free(temp);
 }



以上是我对于插入排序与归并排序的理解,欢迎大家指教与建议。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值