0.简介:
归并排序通过分治的思想,把原序列分解为左右两个子串,在递归合并求解。
归并排序是一种稳定的排序算法,时间复杂度O(nlogn),辅助空间O(n)。
归并排序由分治和合并两个步骤完成。
1.基本操作:
2.代码实现:
1 #include <cstdio> 2 #include <cstring> 3 #define ll long long 4 #define rgi register int 5 #define il inline 6 #define maxn 500010 7 8 using namespace std; 9 10 int n; 11 int a[maxn], temp[maxn]; 12 13 void msort(int l, int r) 14 { 15 if(l == r) 16 return;//如果l==r,那么就不用排序了 17 int mid = (l + r) >> 1; 18 int i = l, j = mid + 1, k = l; 19 msort(l, mid); 20 msort(mid + 1, r);//递归 21 while(i <= mid && j <= r)//当左右两子序列都还有剩余时 22 { 23 if(a[i] <= a[j])//选择较大的 24 temp[k++] = a[i++]; 25 else 26 temp[k++] = a[j++]; 27 } 28 while(i <= mid) 29 temp[k++] = a[i++];//复制左侧的剩余 30 while(j <= r) 31 temp[k++] = a[j++];//复制右侧的剩余 32 for(i = l; i <= r; i++) 33 a[i] = temp[i];//还原回原来的数组中 34 } 35 36 int main() 37 { 38 scanf("%d", &n); 39 for(rgi i = 1; i <= n; i++) 40 scanf("%d", &a[i]); 41 msort(1, n); 42 for(rgi i = 1; i <= n; i++) 43 printf("%d ", a[i]); 44 return 0; 45 }
3.应用:
(1) 逆序对