編程演算法 - 數組中的逆序對 代碼(C)

來源:互聯網
上載者:User

標籤:mystra   編程演算法   數組中的逆序對   代碼   c   

數組中的逆序對 代碼(C)


本文地址: http://blog.csdn.net/caroline_wendy


題目: 在數組中的兩個數字如果前面一個數字大於後面的數字, 則這兩個數字組成一個逆序對.

輸入一個數組, 求出這個數組中的逆序對的總數.


使用歸併排序的方法, 輔助空間一個排序的數組, 依次比較前面較大的數字, 算出整體的逆序對數, 不用逐個比較.


時間複雜度: O(nlogn)


代碼:

/* * main.cpp * *  Created on: 2014.6.12 *      Author: Spike *//*eclipse cdt, gcc 4.8.1*/#include <stdio.h>#include <stdlib.h>#include <string.h>int InversePairsCore(int* data, int* copy, int start, int end) {if (start == end) {copy[start] = data[start];return 0;}int length = (end-start)/2;int left = InversePairsCore(copy, data, start, start+length);int right = InversePairsCore(copy, data, start+length+1, end);int i = start+length; //前半段最後一個數位下標int j = end;int indexCopy = end;int count = 0;while (i>=start && j>=start+length+1) {if (data[i] > data[j]) {copy[indexCopy--] = data[i--];count += j-start-length;} else {copy[indexCopy--] = data[j--];}}for (; i>=start; --i)copy[indexCopy--] = data[i];for (; j>=start+length+1; --j)copy[indexCopy--] = data[j];return left+right+count;}int InversePairs (int* data, int length) {if (data == NULL || length < 0)return 0;int *copy = new int[length];for (int i=0; i<length; ++i)copy[i] = data[i];int count = InversePairsCore(data, copy, 0, length-1);delete[] copy;return count;}int main(void){int data[] = {7, 5, 6, 4};int result =  InversePairs (data, 4);    printf("result = %d\n", result);    return 0;}

輸出:

result = 5





相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.