2017-04-23 14 views
0

2つの整数配列があり、もう一方の配列に基づいて最初の配列をソートしようとしています。Cで別の配列をソートする

例えば、 a = {1,2,3,6,0,0,0};
b = {1,2,2,0,0,0,0};

Bにソート値が

の各整数のための本当の価値である私は、ソート後に期待しています期待される結果は次のとおりです。

a = {2,3,1,6,0,0,0}; 
b = {2,2,1,0,0,0,0}; 

これは私が使用するコードです

int j,k,temp1,temp2; 
for (j=0; j<N; j++){ 
    for (k=j+1; k<N; k++){ 
     if (b[j] < b[k]){ 
      temp1 = b[j]; 
      b[j] = b[k]; 
      b[k] = temp1; 
      temp2 = a[j]; 
      a[j] = a[k]; 
      a[k] = temp2; 
     } 
    } 
} 

それは私に出力を与える:a = {2,3,1,0,0,0,6};b = {2,2,1,0,0,0,0};

私は間違いがどこにあるかは分かりません。何か助けや助言をいただければ幸いです。

+2

私はあなたがアーカイブしたいものを理解しているとは思わない。 「bでソートされた値は、aの各整数の実際の値です」とはどういう意味ですか? –

+0

あなたのコードは問題なく、期待される出力が得られます。たとえば、if条件の中に 'puts(" swap ")を追加して、2つの値が入れ替わったときをチェックし、あなたのケースで2回起こるかどうかを調べることができます。おそらく間違ったソースコードをコンパイルしている可能性があります – Scab

答えて

0

逐語的にあなたのコードの主要な部分を撮影し、MCVE(Minimal, Complete, Verifiable Example)に変換し、私はコードを取得する:

#include <stdio.h> 

static void pr_data(const char *tag, int n, int *a) 
{ 
    printf("%s = { ", tag); 
    const char *pad = ""; 
    for (int i = 0; i < n; i++) 
    { 
     printf("%s %d", pad, a[i]); 
     pad = ", "; 
    } 
    puts(" };"); 
} 

int main(void) 
{ 
    int a[] = { 1, 2, 3, 6, 0, 0, 0 }; 
    int b[] = { 1, 2, 2, 0, 0, 0, 0 }; 
    enum { N = sizeof(a)/sizeof(a[0]) }; 
    pr_data("a", N, a); 
    pr_data("b", N, b); 

    int j, k, temp1, temp2; 
    for (j = 0; j < N; j++) 
    { 
     for (k = j + 1; k < N; k++) 
     { 
      if (b[j] < b[k]) 
      { 
       temp1 = b[j]; 
       b[j] = b[k]; 
       b[k] = temp1; 
       temp2 = a[j]; 
       a[j] = a[k]; 
       a[k] = temp2; 
      } 
     } 
    } 
    pr_data("a", N, a); 
    pr_data("b", N, b); 

    return 0; 
} 

注最も基本的なデバッグテクニック - あなたが動作する前と後のあなたが持っているものを印刷その上に。これにより、データが正しく印刷され、適切なデータが得られ、動作することがわかっている同じ印刷コードを使用して結果が得られることが保証されます。

これからの出力は次のとおりです。

a = { 1, 2, 3, 6, 0, 0, 0 }; 
b = { 1, 2, 2, 0, 0, 0, 0 }; 
a = { 2, 3, 1, 6, 0, 0, 0 }; 
b = { 2, 2, 1, 0, 0, 0, 0 }; 

出力は、あなたが何を望むかのように見えます。したがって、あなたが投稿したコードではなく、投稿していないコードに問題があるようです。どのような形で問題が起こるかははっきりしていません。

-1

あなたが言っていることは、ソートを安定させたいということです。つまり、元の配列で等しい項目は、最終的なソートされた配列で同じ順序を保持します。

実際にここに投稿したコードは実際には安定しており、正しい出力が得られます。

b[j] <= b[k] 

安定ソートではなく、互いに等しいエントリの順序を変更します:私はあなたが次の比較を使用していることを実行している実際のコードと思われます。私はあなたがこの変更を行うことにより、記述されている「間違った」出力を得ることができましたが、あなたとここに掲載したコード:

b[j] < b[k] 

は安定しており、あなたが望んでいた出力を生成します。

関連する問題