題目:
在陣列中的兩個數字,如果前面的乙個數字大於後面的數字,則這兩個數字為乙個逆序對。輸入乙個陣列,求這個陣列的逆序對個數。
例如:給定陣列 ,則有<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...