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