当前位置: 代码迷 >> 综合 >> POJ - 2299 Ultra-QuickSort
  详细解决方案

POJ - 2299 Ultra-QuickSort

热度:31   发布时间:2023-12-08 08:17:38.0

 

#include <iostream>
#define ll long long//因为a[i]范围超过int类型,所以要用long long存储using namespace std;const int N=5e5+5;
int n;
ll cnt;
ll arr[N],temp[N];//temp数组为过度数组void arr_add(ll arr[],int left,int mid,int right)//归并
{if(left>=right) return;int i=left,j=mid+1,k=0;while(i<=mid&&j<=right)//左侧,右侧数组比较较小元素,依次放入temp数组中(此时,左右数组均未完成排序){if(arr[i]<=arr[j])//如果左边的元素小于右边的元素,那么就放到过度数组中{temp[k++]=arr[i++];}else{temp[k++]=arr[j++];cnt+=mid+1-i;//记录逆序数,详见下图}}while(i<=mid)//右侧数组已排序完成,左侧数组还有剩余,将左侧数组依次放入temp数组中{temp[k++]=arr[i++];}while(j<=right)//左侧数组已排序完成,右侧数组还有剩余,将右侧数组依次放入temp数组中{temp[k++]=arr[j++];}for(int i=0;i<k;i++){arr[i+left]=temp[i];}
}void merge_sort(ll arr[],int left,int right)//分割
{if(left>=right) return;int mid=(left+right)>>1;merge_sort(arr,left,mid);merge_sort(arr,mid+1,right);arr_add(arr,left,mid,right);
}int main()
{while(cin >> n && n){cnt=0;for(int i=0;i<n;i++){cin >> arr[i];}merge_sort(arr,0,n-1);cout << cnt << endl;}return 0;
}

 

 

  相关解决方案