簡體   English   中英

使用交替的最小最大值對數組進行排序

[英]Sorting an array with alternate smallest-largest values

給定一個數組,我需要對其進行排序,第一個元素是最小值,第二個元素是最大的,第三個元素是第二個最小的元素,依此類推。

但是我的代碼只是打印原始數組,我不知道為什么。 任何意見,將不勝感激。

#include <stdio.h>
void swap(int m, int n);
int main()
{
    int i,j,A[10],n;

    printf ("enter the number of array elements\n");
    scanf ("%d", &n);

    for (i=0;i<n;i++){
       scanf ("%d", &A[i]);
    }


    for (i=0;i<n;i++){

        if (i%2 == 0){
            for (j=i;j<n;j++){
                if (A[j] < A[i]){
                    swap(A[i],A[j]);
                }
            }
        }
        else if (i%2 != 0){
            for (j=i;j<n;j++){
                if (A[j] > A[i]){
                    swap (A[i],A[j]);
                }
            }
        }

    }

    for(i=0;i<n;i++){
        printf ("%d\n", A[i]);
    }
    return 0;
}

void swap( int m, int n)
{
    int temp;
    temp = m;
    m = n;
    n = temp;
}

您需要使用指針通過引用傳遞。

void swap( int *m, int *n)
{
    int temp;
    temp = *m;
    *m = *n;
    *n = temp;
}

並更改您的代碼以這樣調用它

swap (&A[i],&A[j]);

對於不使用指針的解決方案,您可以使用這樣的 MACRO;

#define swap(x,y) do{int t=(x);(x)=(y);(y)=t;}while(0);

swap(A[i],A[j]);

只需在文件頂部定義它並刪除交換函數和原型。 這都是關於范圍的,因為 MACRO 只是一個文本替換它在正確的范圍內使用 A[i]。

我在你的程序中注意到的第一個問題是你的交換函數。 在您的交換函數中,您的參數是原始數據類型。 因此,該函數創建整數“m”和“n”的副本,並在函數swap的范圍切換值。 但是一旦函數返回,你就沒有真正交換任何東西。 要實際交換您在 main 中創建的數組中的值,您需要通過引用進行傳遞(傳遞指向您嘗試交換的變量的指針)。 像這樣修改你的交換函數:

void swap( int *m, int *n)
{
   int temp;
   temp = *m;
   *m = *n;
   *n = temp;
}

然后在您的 main 中,使用&運算符(address of)傳入數組中該值的地址。 下面是一個例子: swap (&A[i],&A[j]);

其他建議:

  1. 格式化您的代碼,以便在您的 for 循環中的條件之間有空間。
  2. 添加評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM