归并排序法求数组中的倒置数量

前端之家收集整理的这篇文章主要介绍了归并排序法求数组中的倒置数量前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

如果一对元素(A[i],A[j])是倒序的,即i < j但是A[i] > A[j],则他们被称为一个倒置。设计o(nlogn)的算法来计算数组中的倒置数量

利用归并排序实现源码如下:

  1. #include <iostream>
  2. #include <cassert>
  3. using namespace std;
  4.  
  5. void Merge(int *left,int leftSize,int *right,int rightSize,int *result,int &reverseNum)
  6. {
  7. int *left_end = left + leftSize;
  8. int *right_end = right + rightSize;
  9. while(left < left_end && right < right_end) {
  10. if(*left > *right) {
  11. *result++ = *right++;
  12. reverseNum += (left_end - left);
  13. } else
  14. *result++ = *left++;
  15. }
  16. while(left < left_end)
  17. *result++ = *left++;
  18. while(right < right_end)
  19. *result++ = *right++;
  20. }
  21.  
  22. void MergeSort(int *arr,int len,int &reverseNum)
  23. {
  24. if(len == 1)
  25. return;
  26. int leftSize = len / 2,rightSize = len - len / 2;
  27. int *left = new int[leftSize];
  28. int *right = new int[rightSize];
  29. for(int i = 0; i < leftSize; i++)
  30. left[i] = arr[i];
  31. for(int i = 0; i < rightSize; i++)
  32. right[i] = arr[i + leftSize];
  33. MergeSort(arr,leftSize,reverseNum);
  34. MergeSort(arr + leftSize,rightSize,reverseNum);
  35. Merge(left,right,arr,reverseNum);
  36. delete[] left;
  37. delete[] right;
  38. }
  39.  
  40. int calReversePair(int *arr,int len)
  41. {
  42. assert(arr);
  43. int reverseNum = 0;
  44. MergeSort(arr,len,reverseNum);
  45. return reverseNum;
  46. }
  47.  
  48. int main()
  49. {
  50. int a[] = {8,7,6,5,4,3,2,1};
  51. cout << calReversePair(a,sizeof(a) / sizeof(a[0])) << endl;
  52. return 0;
  53. }
运行结果为:28

猜你在找的设计模式相关文章