剑指Offer——求数组中的逆序对

用归并排序

int __mergeSort(vector<int> &data, vector<int> copy, int l, int r)
{
	if (l >= r)
		return 0;
	int mid =(l+r)>>1;
	//cout << "mid:" << mid << endl;
	int leftCount = __mergeSort(copy, data, l, mid);
	int rightCount = __mergeSort(copy, data, mid + 1, r);

	int count = 0;

	int i = l, j = mid + 1;
	for (int k = l; k <= r; k++)
	{
		if (i > mid)
			data[k] = copy[j++];
		else if(j>r)
			data[k] = copy[i++];
		else if(copy[i]<=copy[j])
			data[k] = copy[i++];
		else
		{
			//cout << "add:" << mid - i + 1;
			count += mid - i + 1;
			
			data[k] = copy[j++];
		}		
	}
	return leftCount + rightCount + count;

}




int InversePairs(vector<int>& data)
{
	int n = data.size();
	vector<int> copy;
	copy.assign(data.begin(), data.end());
    
	return __mergeSort(data,copy, 0, n-1);

}

猜你喜欢

转载自blog.csdn.net/eereere/article/details/80333173