2017-04-23 136 views
0

我有兩個整數數組,我想基於另一個數組對第一個數組進行排序。對基於另一個數組的數組進行排序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」)'來檢查兩個值交換的時間,在你的情況下它會發生兩次。你可能已經編譯了錯誤的源代碼 – 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] 

是穩定的,併產生你想要的輸出。

相關問題