如何删除元素以对数组进行排序

时间:2014-12-24 12:37:09

标签: c arrays sorting do-while

我必须创建一个程序,将数组按升序排序,这是我的代码是通过找到最大的元素,然后将其分配给第二个数组,然后从第一个数组中删除此元素来做到这一点,所以我可以找到第二大的,然后将其重新分配到第二个阵列的第二个位置。这是我的代码:

#include <stdio.h>
#include <conio.h>

int main(){

    int x;
    scanf("%d", &x);
    int arr[x], arr1[x];

    int i;
    for(i = 0; i < x; i++){
          scanf("%d", &arr[i]);
          }

    do{
          int j, max = 0;
    for(j= 0; j < x; j++){
           if(arr[j] > max){
                     max = arr[j];
                     }
           }
    int k = 0;
    arr1[k] = max;
    k++;


          }while(sizeof(arr1) < sizeof(arr));

    int l;
    for(l = 0; l < x; l++){
          printf("%d\n", arr1[l]);
          getch();
          }
    }

但由于某种原因,它没有分配第二个数组的第二个值。

3 个答案:

答案 0 :(得分:3)

sizeof(arr1) < sizeof(arr)这将始终评估为FALSE,因为两个数组的相同大小,如代码所示。

这就是为什么do..while循环只执行一次。

另外,正如Daniofb提供的答案所示,

int k = 0;
arr1[k] = max;
k++;

错误,就像do...while的每次迭代一样,它会将k初始化为0,因此,每次都会覆盖arr1[0]元素值。请从循环内删除int k = 0;

答案 1 :(得分:2)

这段代码

int k = 0;
arr1[k] = max;
k++;

将始终将arr1[0]设置为max,因为您在上一行中设置了k = 0;。我想你可以使用qsort中的stdlib.h函数对数组进行排序,然后复制到另一个数组。 Sourav Ghosh也是对的。

答案 2 :(得分:0)

您不需要使用2个数组...
你只需要使用1个数组即可完成所有工作...

#include <stdio.h>
#include <conio.h>

int main(){

    int x;
    scanf("%d", &x);
    int arr[x];

    int i;
    for(i = 0; i < x; i++){
        scanf("%d", &arr[i]);
    }
    // k is for the k'th maximum value
    int k=x-1;
    do{
        int j, max_ind = 0; // max_ind = for k'th maximum value position
        for(j = 1; j <= k; j++){
            if(arr[j] > arr[max_ind]){
                max_ind = j;
            }
        }
        // max_ind is the k'th '
        // Swapping with k'th position value
        int temp=arr[max_ind];
        arr[max_ind]=arr[k];
        arr[k]=temp;
        k--;
    }while(k>0);

    int l;
    for(l = 0; l < x; l++){
        printf("%d\n", arr[l]);
        getch();
    }
}

这里我们在每次迭代中计算x'th maximum, x-1'th maximum, x-2'th maximum...