2017-10-26 12 views
-1

Aの値でソートされたA [サイズ]のインデックスを含むリストint A [サイズ]とリストmaxA [サイズ]があります。基本的にA [maxA [ 0]]はAの中で最大のintの要素でなければならず、maxA [0]はそのインデックスでなければなりません。ここで qsortを使ってリストをソートする

は私の比較関数である:

int compareA(const void *a,const void *b){ 
    return A[*(TYPE *)b] - A[*(TYPE *)a]; 
} 

そして私は

qsort(maxA,SIZE_L,sizeof(int),compareA); 

でそれを呼び出す私は、ランダムなpossitive数で要素の値を増加させ、ループを持っているとき、[I] > L(Lはエンディングのリストによって定義され、ランダムなものです):

A[maxA[i]] = INT_MIN; 

it しばらくすると、動作が停止します。ここに私の出力です:

INDEX VALUE 
1 320 
2 207 
8 -437 
3 -681 
4 -960 
6 -1638 
5 -2928 
9 -7395 
7 -19272 
0 -2147483648 
Removed: 1 
6 -1560 500     
5 -2684 1000     
9 -7140 1066     
7 -18396 1168    
1 -2147483648 
0 -2147483648 
2 276 
3 0 
8 -418 
4 -864 

私はこのランダムな動作を取得します。

+2

コードを記述するのではなく([私はリストを持っています...])、[最小限の、完全で、検証可能な例](http://stackoverflow.com/help/mcve)を作成してください。 –

+1

用語には注意してください。あなたは2つの配列を持っています。リストには、リンクされたリストの意味がありますが、これはまったく異なります。 –

+0

'qsort_r()'を調べたいかもしれませんが、それは非標準であり、異なるプラットフォームが同じ名前に対して異なる(完全に互換性のない)インタフェースを実装しています。 –

答えて

1

醜いハッキングをしない限り、やりたいことはほぼ不可能です。 qsortはこれをサポートしていません。

私はカスタムソート機能を書いています。ソートアルゴリズムを選択し、Webでいくつかのコードを検索します。バブルソート、選択ソート、挿入ソートは実装が簡単です。一般的なケースのパフォーマンスをさらに向上させたい場合は、クイックソート、マージソート、またはヒープソートを参照できます。しかし、これを整数配列にしたいのであれば、バケットソートを見ることができます。あなたがしたことは、見つけたコードを簡単に修正することです。例えば

、変更:

void sort(int * arr, size_t size) 
{ 
    ... 
    if([i]<arr[i+1]) { 
     swap(arr[i], arr[i+1]) 
    } 
    ... 
} 

void sort(int * arr, size_t size, int * arr2, size_t size2) 
{ 
    ... 
    if(arr[i]<arr[i+1]) { 
     swap(arr[i], arr[i+1]) 
     swap(arr2[i], arr2[i+1]) 
    } 
    ... 
} 

に単に引数リストに二番目の配列およびサイズを追加し、両方のアレイ上の同じ変更を行います。

そして、ジョナサン・レフラー(Jonathan Leffler)は、listarrayという単語の使い方に注意してください。リストは通常​​、リンクされたリストです。ソートするのはややこしいですが、それが望ましいものであれば、それについてのコード例を見つけることは非常に簡単です。 qsortでこれを解決しようとしているので、私はあなたが配列について話していると仮定します。

既存のqsortを使用する場合は、最初に構造体の配列を作成することをお勧めします。このようなもの:

typedef struct { 
    int A; 
    int maxA; 
} comboElement; 

... 
comboElement mergedList[size]; 
for(int i=0; i<size; i++) { 
    mergedList[i].A = A[i]; 
    mergedList[i].maxA = maxA[i]; 
} 

qsort(mergedList, size, sizeof(mergedList[0]),compareMergedList); 

もちろん、比較機能を書き直す必要があります。ここにない側:qsortを呼び出すときはsizeof <type>を使用しないでください。代わりにsizeof <first element in list>を使用してください。その理由は、将来型を変更すると、すべてのインスタンスを変更することを忘れる可能性があるからです。

関連する問題