美文网首页
归并排序

归并排序

作者: foolish_hungry | 来源:发表于2020-06-25 17:22 被阅读0次

    思想:先分后合思想, 分到不可以在分, 然后比较大小, 合并数据。

    看图清晰明了

    image.png

    代码实现

    // 归并排序算法, a 数组, n 表示数组大小
    void mergeSort(int a[], int n) {
        if (n <= 1) {
            return;
        }
        mergeSort_c(a, 0, n - 1);
        
        // 打印数据
        for (int i = 0; i < n; i++) {
            NSLog(@"%d", a[i]);
        }
    }
    
    // 递归调用函数
    void mergeSort_c(int a[], int left, int right) {
        // 递归终止条件
        if (left >= right) {
            return;
        }
        // 找到中间位置
        int mid = (left + right) / 2;
        // 分治递归
        mergeSort_c(a, left, mid);
        mergeSort_c(a, mid + 1, right);
        // 合并数据
        mergeData(a, left, mid, right);
    }
    
    // 将数据合并
    void mergeData(int a[], int left, int mid, int right) {
        int i, j, k;
        i = left;
        j = mid + 1;
        k = 0;
        
        // 创建临时数组, 用于数据合并
        int temNum = (right - left) + 1;
        int tempArr[temNum];
        
        // 将前半部分和后半部分数据比较, 合并到临时数组
        while (i <= mid && j <= right) {
            if (a[i] < a[j]) {
                tempArr[k++] = a[i++];
            } else {
                tempArr[k++] = a[j++];
            }
        }
        
        // 将前半部分没有迁移的数据直接赋值到临时数组后面
        while (i <= mid) {
            tempArr[k++] = a[i++];
        }
      
        // 将后半部分没有迁移的数据直接赋值到临时数组后面
        while (j <= right) {
            tempArr[k++] = a[j++];
        }
        
        // 将临时数组中的数据赋值到原始数组中
        for (int l = left; l <= right; l++) {
            a[l] = tempArr[l-left];
        }
    }
    

    使用

        int a[] = {4, 13, 2, 1, 7, 9, 10, 8, 3, 6};
        int num = sizeof(a) / sizeof(int);
        mergeSort(a, num);
    

    相关文章

      网友评论

          本文标题:归并排序

          本文链接:https://www.haomeiwen.com/subject/qhnsfktx.html