归并排序

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

看图清晰明了

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

你可能感兴趣的:(归并排序)