新手讲算法 归并排序之 从前往后合并,从后往前合并
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中所有元素构成逆序对

浙公网安备 33010602011771号