陣列中逆序對

2021-06-22 01:31:53 字數 2242 閱讀 4562

題目:

在陣列中的兩個數字,如果前面的乙個數字大於後面的數字,則這兩個數字為乙個逆序對。輸入乙個陣列,求這個陣列的逆序對個數。

例如:給定陣列 ,則有<5,3>、<5,1>、<8,3>、<8,1>、<3,1> 這5個逆序對。

問題分析

:我採用兩種方法來解決這個問題:

1)考慮到二叉搜尋樹中每個節點x,它的左子樹所有關鍵字的值小於節點x的值,而右子樹的所有關鍵字的值大於節點x的值,根據這種特點設計一種資料結構儲存每一節點,資料結構如下所示:

struct treenode;

程式讀取陣列的元素,構建節點並插入節點,在建立二叉搜尋樹過程中,改變結構體的rightchildnum成員的值來計算陣列的逆序對。具體參考程式。

2)運用歸併排序方法解決這個問題,思路在《劍指offer》有詳細說明。這裡不再多說。

**:1)的方法

#include #include struct treenode;

typedef struct treenode *searchtree;

struct treenode;

static int inversecount=0; //用於統計逆序對的個數

searchtree

insert(int x, searchtree t)else

}else if(x < t->value)else if(x > t->value)

return t;

}searchtree

createarraynode(int array,int n)

}void

removetree(searchtree t)

}int

main(int argc,char **argv);

// int array[4]=;

// int array[7]=;

int array=;

t=createarraynode(array,23);

printtree(t);

printf("\n");

printf("inverse count is: %d\n",inversecount);

removetree(t);

return 0;

}

2)歸併排序的**:

標頭檔案:"fatal.h"

#include #include #define		error(str)        fatalerror(str)

#define fatalerror(str) fprintf(stderr,"%s\n",str),exit(1)

#include "fatal.h"

typedef int elementtype;

intmerge( elementtype a, elementtype tmparray, int lpos, int rpos, int rightend )else

tmparray[tmpos--] = a[rightend--];

while( lpos <= leftend )

tmparray[tmpos--] = a[leftend--];

while( rpos <= rightend )

tmparray[tmpos--] = a[rightend--];

for( i=0; i < numelements; i++, lpos++ )

a[lpos] = tmparray[lpos];

return count;

}int

msort( elementtype a, elementtype tmparray, int left, int right )

intmergesort( elementtype a, int n )else

fatalerror( "no space for tmp array!!!" );

return count;

}int

main();

elementtype arr=;

count = mergesort(arr,5);

printf("inverse numbers is: %d\n",count);

return 0;

}

《資料結構與演算法分析-c語言描述》(美)mark allen weiss

希望大家能夠多多交流!

陣列中的逆序對

來自劍指offer 分析 我們第一反應是順序掃瞄整個陣列,每掃瞄到乙個數字時,逐個比較該數字和它後面的數字的大小。如果後面的數字比它小,則這個兩個數字就組成了乙個逆序對。假設陣列有n個數字,由於每個數字都要和o n 個數字作比較,因此這個演算法的時間複雜度為o n 2 換思路 我們採用歸併思想,先考...

陣列中的逆序對

題目 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。用歸併排序演算法,歸併的時候,從後向前歸併。include using namespace std int getreversenum int p1,int p2,int...

陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。include using namespace std int inverpaircore int data,int copy,int start,int end int le...