0
void sort_int_array(int A[], int n) {
    int i, j, h, k, O[n];
    /* assume that A[0] to A[n-1] have valid values */
    for (i=1; i<n; i++) {
        /* swap A[i] left into correct position */
        for (j=i-1; j>=0 && A[j+1] <= A[j]; j--) {
            int_swap(&A[j], &A[j+1]);
            for (k=0; k<n; k++) {
                 for (h = 0; h < k; h++) {
                    if (A[k] == O[h]) {
                         break;
                    }
                    else {
                        O[k] = A[k];
                    }
                }
            }
        }   
    }
}   

ソートされた配列から別の配列に個別の値のみを書き込もうとしています。関数の最初の部分は配列を並べ替えますが、それを新しい配列に書き込むと、並べ替えられた配列が返され、コピーは削除されません。

例えば。入力:4 5 6 7 6 5 4.出力:4 4 5 5 6 6 7.

必要な出力:4 5 6 7

4

2 に答える 2

0

この方法で試すことができます。

  1. 最初に配列をソートします。 4 4 5 5 6 6 7
  2. 最初の要素は常に区別されます。2 番目の配列にコピーします。
  3. 次に、ソートされた配列の 2 番目の要素から開始し、2 番目の配列に存在する 1 つの要素と比較してからコピーします。
  4. sorted[i]==output[j] の場合、i をインクリメントするか無視します。
  5. それ以外の場合、要素を出力配列にコピーithし、j と i の両方をインクリメントします
  6. ソートされた配列を完全にトラバースしている間にこれを行います。

これでうまくいきます。

int[] arr = {4,4,5,5,6,6,7};
    int out[]= {0}; // or may be some size
    int i=1;
    out[0] = arr[0];
    int j=0;
    while(i<arr_length){
        if(arr[i]!=out[j]){
            out[++j]=arr[i];
        }
        i++;
    }
    for(int k=0;k<out_length;k++){
        printf("%d,",out[k]);
    }
于 2013-06-26T10:52:35.443 に答える
0
void sort_int_array(int A[], int n) {
    int i, j, k, O[n];
    for(k=i=0; i<n; ++i){
        for(j=i+1;j<n;++j){
            if(A[j]<A[i])
                int_swap(&A[j],&A[i]);
        }
        if(i==0 || O[k-1] < A[i])
            O[k++]=A[i];
    }
    printf("DEBUG:");
    for(i=0;i<k;++i)
        printf("%d ", O[i]);
    printf("\n");
}
于 2013-06-26T14:24:38.030 に答える