zoukankan      html  css  js  c++  java
  • 归并排序

    思路

        1. 分解(将一个数组拆分成两个数组)
        2. 合并(将两个有序的数组合并成一个有序的数组,借助一个辅助数组)
    

    代码

    #include <stdio.h>
    
    // 将arr[l...mid]和arr[mid+1...r]两部分进行归并
    
    void __merge(int arr[], int l, int mid, int r){
        
        // 经测试,传递aux数组的性能效果并不好
        int aux[r-l+1];//设置辅助数组
        for( int i = l ; i <= r; i ++ ){
            aux[i-l] = arr[i];
        }
        int i = l, j = mid+1;
        //将辅助数组中拆分的两部分有序的插入原数组中
        for( int k = l ; k <= r; k ++ ){
            if( i > mid ){
                arr[k] = aux[j-l]; j ++;
            }else if( j > r ){
                arr[k] = aux[i-l]; i ++;
            }else if( aux[i-l] < aux[j-l] ){
                arr[k] = aux[i-l]; i ++;
            }else{
                arr[k] = aux[j-l]; j ++;
            }
        }
    }
    
    // 递归使用归并排序,对arr[l...r]的范围进行排序
    
    void __mergeSort(int arr[], int l, int r){
        
        if( l >= r ){//不能再次拆分则直接返回
            return;
        }
        //能继续拆分进行拆分
        //int mid = (l+r)/2;
        int mid = l+(r-l)/2;    //这样比上面的写法更好
        __mergeSort(arr, l, mid);
        __mergeSort(arr, mid+1, r);
        //进行合并
        __merge(arr, l, mid, r);
    }
    
    
    void mergeSort(int arr[], int n){
        
        __mergeSort( arr , 0 , n-1 );
    }
    
    
    int main() {
        
        int arr[10] = {2,4,8,6,5,7,3,9,1,0};
        mergeSort(arr, 10);
        for (int i=0; i<10; i++) {
            printf("%d
    ",arr[i]);
        }
        return 0;
    }
    
  • 相关阅读:
    java类型比较_Java数据类型的比较
    学习方法-1:海绵学习法
    性能测试:TPS和QPS的区别
    代码反思
    网站TLS升级 1.0&1.1--1.2
    Mysql常用语法
    初级测试工程师面试指南
    postman实战之断言
    postman预处理脚本实战
    什么是HTTP超文本协议
  • 原文地址:https://www.cnblogs.com/zheng-chuang/p/6860566.html
Copyright © 2011-2022 走看看