您的位置:首页 > 其它

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

2017-12-03 10:04 197 查看
此篇为原创,如需转载,请注明出处: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++];

         
8e81
     }

              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);

 }



以上是我对于插入排序与归并排序的理解,欢迎大家指教与建议。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: