對數組排序后,獲取排序前元素索引
寫在前面
最近基本都在弄實驗室的事情,自己設計了兩個算法,有大把的數據需要跑,大把的模型需要渲染。。。
在設計的算法中,有一個需求是,對一個double數組OriArray進行排序,排序之后記為SortedArray,現在需要獲取SortedArray數組中的每個元素在原始數組OriArray中的索引。
這個需求如果在OC中實現的話蠻簡單的,把<原索引,數組元素>作為鍵值對放入某個字典,按照數組元素對字典進行排序,然后要獲取排序后的數組在原始情況下的索引,只需直接訪問其key就可以了。但是C++中沒有直接的這樣的數據結構,因此我們可以自己構造一個。
代碼實現
按照上文中的思路,構造一個<原索引,數組元素>的數據結構,如下
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; }
運行結果

總結
對一個數組進行排序后,要獲取排序后數組中的某個元素在原始數組中的索引值時,可以使用本文介紹的方法進行排序。其核心就是自己構造一個結構體,結構體中包含原始數組的元素和其對應的索引,然后使用快排對結構體排序,排序之后,可以直接通過結構體獲取其元素在原始數組中的索引。
