根号N段合并排序


  • 问题:
将数组a[0,n-1]划分为 根号N向下取整 个子数组,每个子数组有 O(根号N)个元素。然后递归地对分割后的子数组进行排序,最后将所得到的 根号N向下取整 个排好序的子数组合并排序。

  • 思路:
    类似于归并排序,不过子问题数由 2 变为 根号N向下取整个,递归的结束条件由p==q变为根号子问题规模 <=1(即,子问题规模为1、2或者3),还需要注意的是:若根号子问题规模==1则对子问题内的序列进行排序

  • 实现代码(C++):
#include 
#include 
#include 
using namespace std;

void sort_2_3(int* arr, int p, int q){
    int num = q - p + 1;
    if(num == 2){
        cout<<"sort_2_3 2:"< arr[p+1]){
            int tmp = arr[p];
            arr[p] = arr[p+1];
            arr[p+1] = tmp;
        }
        cout<<"sort_2_3 2:"< Max){
                Max = arr[p + index];
                max_i = index;
            }
        }
        int Mid = arr[ p + 3 - min_i - max_i ];
        arr[p] = Min;
        arr[p + 1] = Mid;
        arr[p + 2] = Max;
        cout<<"sort_2_3 3:"< > tmps (num);
    for(; i< num- 1; i++){
        tmps[i].resize(num + 1);
    }
    tmps[i].resize(n - i*num + 1);

    //初始化数据
    for(i=0; i < num - 1; i++){
        int j=0;
        for(; j < num; j++){
            tmps[i][j] = arr[p + i*num + j];
        }
        tmps[i][j] = INT_MAX;
    }
    int in = 0;
    for(; in < n - i * num; in++)
        tmps[i][in] = arr[p + i*num + in];
    tmps[i][in] = INT_MAX;

    cout<<"初始化数据:"< 1){
        int i=0;
        for(;i < num -1 ; i++){
            cout<



  • 补充问题:

用分治法设计一个算法,在数组A中寻找最大元素和最小元素


  • 思路:
    与上题类似,不过更加简单,不需要merge过程,把sort_2_3()函数功能从对规模为2、3的子问题进行排序,改为求对规模为2、3的子问题的最大、最小值

  • 实现(C++):
#include 
#include 
#include 
using namespace std;

void sort_2_3(int* arr, int p, int q, int* arr_min_max){
    int num = q - p + 1;
    int len = 0;
    if(num == 2){
        len = 2;
    }else if(num == 3){
        len = 3;
    }
    for(int i=p; i < p + len; i++){
        if(arr[i] < arr_min_max[0]){
            arr_min_max[0] = arr[i];
        }
        if(arr[i] > arr_min_max[1]){
            arr_min_max[1] = arr[i];
        }
    }
}

void sqrt_n_sort(int* arr, int p, int q, int* arr_min_max){
    cout<<"deviation"< 1){
        int i=0;
        for(;i < num -1 ; i++){
            cout<

你可能感兴趣的:(根号N段合并排序)