- 利用临时数组合并。
- 当只关心一个整体的解时,可以将其内部排序,方便计算。
- 利用归并的思路恰好求出了逆序数。
归并思路:从两个部分从小到大的提取数到临时数组中。
void merge_sort(int *A, int x, int y, int *T)//A是原数组,T是临时数组,x是左边界,y是右边界 { if(y-x > 1) { int m = x + (y-x)/2; int p = x;//左指引 int q = m;//右指引 int i = x;//T的指引 // int cnt = 0; //用于求逆序数时。 merge_sort(A, x, m, T); merge_sort(A, m, y, T); while(p < m || q < y)//左闭右开 { if(q >= y || ((p < m) && A[p] < A[q]))//左半数组,当右半结束或者左小于右 T[i++] = A[p++]; else//右半数组 { T[i++] = A[q++]; // cnt += m-p; //每从右半过来一个数,说明左半剩下的数都更大 } } for(i = x; i < y; ++i)//将临时数组的值赋回去 A[i] = T[i]; } }
归并排序 求逆序数
最新推荐文章于 2022-10-05 18:53:13 发布