新手讲算法 归并排序之 从前往后合并,从后往前合并

1.归并排序的思想 分治

(1)对数组进行不断拆分,直到每个数组里面只有 1个元素

(2)1个元素的数组,进行合并,变成两个元素的有序数组,两个合并变成4个元素的有序数组

 

2.归并排序的关键在于:合并数组,掌握每次合并的数组边界

 

3.废话不多说,直接上代码  此方法是合并数组从前往后合并

#include<iostream>
#include <algorithm>
using namespace std;

int *p;
void mergeArray(int *a, int start, int mid, int end) {
    //相当于把  start->mid ; mid + 1 -> end  的有序数组进行合并
    //借用了临时数组p,将合并后的结果放到p中,之后再挪回来a中
    int i = start, j = mid + 1, k = start;
    while(i <= mid && j <= end) {
        if(a[i] <= a[j]) {
            p[k++] = a[i++];
        } else {
            p[k++] = a[j++];
        }
    }
    
    while(i <= mid) {
        p[k++] = a[i++];
    }
    
    while(j <= end) {
        p[k++] = a[j++];
    }
    
    for(int i = start; i <= end; i++) {
        a[i] = p[i];
    }
}

void mergeSort(int *a, int start, int end) {
    //分治思想,均分成两个数组,问题变成了对两个子数组进行排序,合并两个子数组成一个数组
    if(start == end) {
        return;
    }
    int mid = (start + end) / 2;
    mergeSort(a, 0, mid);
    mergeSort(a, mid + 1, end);
    mergeArray(a, start, mid, end);
}

int main(){
    int N;
    cin>> N;
    int *a;
    a = new int[N];
    for(int i = 0; i < N; i++) {
        cin>>a[i];
    }
    
    p = new int[N];
    mergeSort(a, 0, N - 1);
    
    for(int i = 0; i < N; i++) {
        cout<<a[i]<<' ';
    }
    
    return 0;
}

 

3.2  此方法 合并数组从后往前合并

#include<iostream>
#include <algorithm>
using namespace std;

int *p;
void mergeArray(int *a, int start, int mid, int end) {
    //相当于把  start->mid ; mid + 1 -> end  的有序数组进行合并
    //借用了临时数组p,将合并后的结果放到p中,之后再挪回来a中
    int i = mid, j = end, k = end;
    while(i >= start && j >= mid + 1) {
        if(a[i] >= a[j]) {
            p[k--] = a[i--];
        } else {
            p[k--] = a[j--];
        }
    }
    
    while(i >= start) {
        p[k--] = a[i--];
    }
    
    while(j >= mid + 1) {
        p[k--] = a[j--];
    }
    
    for(int i = start; i <= end; i++) {
        a[i] = p[i];
    }
}

void mergeSort(int *a, int start, int end) {
    //分治思想,均分成两个数组,问题变成了对两个子数组进行排序,合并两个子数组成一个数组
    if(start == end) {
        return;
    }
    int mid = (start + end) / 2;
    mergeSort(a, 0, mid);
    mergeSort(a, mid + 1, end);
    mergeArray(a, start, mid, end);
}

int main(){
    int N;
    cin>> N;
    int *a;
    a = new int[N];
    for(int i = 0; i < N; i++) {
        cin>>a[i];
    }
    
    p = new int[N];
    mergeSort(a, 0, N - 1);
    
    for(int i = 0; i < N; i++) {
        cout<<a[i]<<' ';
    }
    
    return 0;
}

  

    从后往前合并,可算出 数组中的逆序对。

1.两个有序数组  a,b,从后往前合并

2.如果a此时遍历的最后一个元素,大于 b此时遍历的最后一个元素,说明:a的这个元素 和b中所有元素构成逆序对

posted @ 2018-04-01 09:48  jiguojing  阅读(377)  评论(0编辑  收藏  举报