最近基本都在弄實驗室的事情,本身設計了兩個算法,有大把的數據須要跑,大把的模型須要渲染。。。
在設計的算法中,有一個需求是,對一個double數組OriArray進行排序,排序以後記爲SortedArray,如今須要獲取SortedArray數組中的每一個元素在原始數組OriArray中的索引。
這個需求若是在OC中實現的話蠻簡單的,把<原索引,數組元素>做爲鍵值對放入某個字典,按照數組元素對字典進行排序,而後要獲取排序後的數組在原始狀況下的索引,只需直接訪問其key就能夠了。可是C++中沒有直接的這樣的數據結構,所以咱們能夠本身構造一個。node
按照上文中的思路,構造一個<原索引,數組元素>的數據結構,以下web
struct node { double data; int No; };
排序咱們直接使用系統中自帶的快排算法。其函數原型以下算法
qsort(array, num_of_data_in_array,sizeof(array[0]),comp)
其中第一個參數爲數組名,第二個參數爲數組中元素個數,第三個參數爲數組中元素的sizeof,第四個元素爲排序方式。在咱們的需求中,須要排序的是一個結構體,咱們須要按照結構體node中data的大小進行升序排序,其比較函數comp定義以下數組
int comp(const void *a, const void *b) { return (*(struct node *)a).data> (*(struct node *)b).data?1:-1; }
函數原型中的函數參數是兩個void類型的指針,在函數體中,須要作指針類型轉換,而後按照data升序排序。
測試代碼以下數據結構
int main() { double a[] = {3.0, 4.0, 2.5,1.1, 5.6}; int n = sizeof(a)/sizeof(double); struct node arry[sizeof(a)/sizeof(double)]; int i; for(i = 0; i < n;++i) { arry[i].data = a[i]; arry[i].No = i; } qsort(arry,n,sizeof(struct node),comp); for ( i = 0; i < n; i++) { arry[i].data = a[i]; arry[i].No = i; } qsort(arry, n, sizeof(struct node), comp); printf("(當前值,原索引)\n"); for(i = 0; i < n;++i) { cout<<arry[i].data<<"\t"<<a[i]<<"\t"<<arry[i].No<<endl; } system("pause"); return 0; }
運行結果
函數
對一個數組進行排序後,要獲取排序後數組中的某個元素在原始數組中的索引值時,能夠使用本文介紹的方法進行排序。其核心就是本身構造一個結構體,結構體中包含原始數組的元素和其對應的索引,而後使用快排對結構體排序,排序以後,能夠直接經過結構體獲取其元素在原始數組中的索引。測試