整数

2016-04-01 8 views
-4
へのポインタの配列をソート
int arr1[] = { 3, 9, 6, 7 }, arr2[] = { 2, 5, 1 }, arr3[] = { 0 }, 
arr4[] = { 1, 6 }, arr5[] = { 4, 5, 6, 2, 1 }; 
int* pointersArray[5] = { &arr1, &arr2, &arr3, &arr4, &arr5 };  
for (k = 0; k< 5; k++) 
{ 
    for (i = 0; i < **(pointersArray + k)+1; i++) 
    { 
     for (j = i + 1; j < **(pointersArray + k); ++j) 
     { 
      if ((*(*(pointersArray + k) + i)) > *(*(pointersArray + k) + j)) 
      { 
       temp = *(*(pointersArray + k) + i); 
       *(*(pointersArray + k) + i) = *(*(pointersArray + k) + j); 
       *(*(pointersArray + k) + j) = temp; 
      } 
     } 
     printf("\n"); 
    } 
} 
for (j = 0; j < 5; j++) 
{ 
    for (i = 0; i < **(pointersArray + j) + 1; i++) 
    { 
     printf("%d", *(*(pointersArray + j) + i)); 
    } 
    printf(" "); 
} 

Iは、最初のセルをソートすることなく(各配列のサイズは、最初のセル+ 1)pointersArrayで各アレイをソートします。上に私の非作業コードは、それを修正するための任意のアイデアですか?整数

出力:

3697 
251 
0 
16 
256 

予想される出力:

3679 
215 
0 
16 
41256 
+0

ているのですか? – flaviodesousa

+2

はい - あなたはそれをデバッグすることができます。 –

+0

最も内側のループを比較関数にリファクタリングします。 (あなたはおそらく、あなたがいろいろなアイテムを見つけたらループから脱出すべきです。) –

答えて

2

ここでは、されています。

#include <stdio.h> 

int main(void) 
{ 
    int arr1[] = { 3, 9, 6, 7 }; 
    int arr2[] = { 2, 5, 1 }; 
    int arr3[] = { 0 }; 
    int arr4[] = { 1, 6 }; 
    int arr5[] = { 4, 5, 6, 2, 1 }; 

    int * pointersArray[] = { arr1, arr2, arr3, arr4, arr5 }; 
    const size_t N = sizeof(pointersArray)/sizeof(*pointersArray); 

    for (size_t k = 0; k < N; ++k) 
    { 
     size_t n = *pointersArray[k]; 

     for (size_t i = 0; i < n; i++) 
     { 
      for (size_t j = 1; j < n - i; j++) 
      { 
       if (pointersArray[k][j+1] < pointersArray[k][j]) 
       { 
        int tmp = pointersArray[k][j+1]; 
        pointersArray[k][j+1] = pointersArray[k][j]; 
        pointersArray[k][j] = tmp; 
       } 
      } 
     } 
    } 

    for (size_t k = 0; k < N; ++k) 
    { 
     size_t n = *pointersArray[k] + 1; 
     for (size_t i = 0; i < n; i++) printf("%d ", pointersArray[k][i]); 
     printf("\n"); 
    }   

} 

プログラムの出力は

3 6 7 9 
2 1 5 
0 
1 6 
4 1 2 5 6 

が、それは単純になり、あなたが手動でバブルソート関数を書くのではなく、標準のC関数qsortを使用する場合、コードがより明確になりますことを考慮してくださいです。 Cにおいて

3 6 7 9 
2 1 5 
0 
1 6 
4 1 2 5 6 

上記のように、例えば

#include <stdlib.h> 
#include <stdio.h> 

int cmp(const void *lhs, const void *rhs) 
{ 
    int a = *(int *)lhs; 
    int b = *(int *)rhs; 

    return (b < a) - (a < b); 
} 

int main(void) 
{ 
    int arr1[] = { 3, 9, 6, 7 }; 
    int arr2[] = { 2, 5, 1 }; 
    int arr3[] = { 0 }; 
    int arr4[] = { 1, 6 }; 
    int arr5[] = { 4, 5, 6, 2, 1 }; 

    int * pointersArray[] = { arr1, arr2, arr3, arr4, arr5 }; 
    const size_t N = sizeof(pointersArray)/sizeof(*pointersArray); 

    for (size_t i = 0; i < N; ++i) 
    { 
     qsort(pointersArray[i] + 1, *pointersArray[i], sizeof(int), cmp); 
    } 

    for (size_t k = 0; k < N; ++k) 
    { 
     size_t n = *pointersArray[k] + 1; 
     for (size_t i = 0; i < n; i++) printf("%d ", pointersArray[k][i]); 
     printf("\n"); 
    }   

} 

について

出力は同じになります++ヘッダ<algorithm>で宣言され、標準的なアルゴリズムstd::sortを使用することができます。 例

#include <iostream> 
#include <algorithm> 

int main() 
{ 
    int arr1[] = { 3, 9, 6, 7 }; 
    int arr2[] = { 2, 5, 1 }; 
    int arr3[] = { 0 }; 
    int arr4[] = { 1, 6 }; 
    int arr5[] = { 4, 5, 6, 2, 1 }; 

    int * pointersArray[] = { arr1, arr2, arr3, arr4, arr5 }; 

    for (auto p : pointersArray) 
    { 
     std::sort(p + 1, p + 1 + *p); 
    } 

    for (auto p : pointersArray) 
    { 
     size_t n = *p + 1; 
     for (size_t i = 0; i < n; i++) std::cout << p[i] << ' '; 
     std::cout << std::endl; 
    }   

} 

のために出力が期待される出力は何

3 6 7 9 
2 1 5 
0 
1 6 
4 1 2 5 6