C - 如何按升序排列一对夫妇的第一个数字?

时间:2017-05-22 13:51:02

标签: c arrays sorting bubble-sort

我的作业是:编写一个获取整数数组的函数。自N * 2 = the size以来数组的N = how many couples you will scan。该阵列包括数组。我需要打印复数索引上的数字按升序排列的数字。

示例:

Input: 4, -6, 2, 10, 3, 0, 1, 9
Ouput: 1, 9, 2, 10, 3, 0, 4, -6 
With N = 4.

如果我设置N = 4,它只允许我扫描4个数字,而不是8个。为什么会这样?它甚至会在第4个扫描号码后打印出奇怪的数字。

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

int main()
{
int n, sz1, sz2;
int i, j, cs, cs2;
printf("Enter the value of n:\n");
scanf("%d", &n);
int array[2*n];
printf("Enter the numbers in the array:\n");
for(i=0; i<2*n; i++)
{
    scanf("%d", &array[i]);
    i++;
}
for(i=0; i<2*n; i++)
{
    for(j=i+1; j<2*n; j++)
    {
        if(array[i]>array[j] && i%2==0 )
        {
            cs=array[i];
            array[i]=array[j];
            array[j]=cs;
            cs2=array[i+1];
            array[i+1]=array[j+1];
            array[j+1]=cs2;
        }
    }
}
for(i=0; i<n*2; i++)
    printf("%d  %d\n", array[i], array[i]);
return 0;
}

3 个答案:

答案 0 :(得分:1)

在第一个循环结束时,您不应该i++,因为您已经在for子句中执行了此操作。按照你正在做的方式,在每个循环中,i增加两次,给你一半的循环。

此外,当您尝试从数组中读取时,未设置其他所有元素,因此它可能包含垃圾数据。

答案 1 :(得分:1)

我们初学者应该互相帮助。:)

这些循环

for(i=0; i<2*n; i++)
{
    for(j=i+1; j<2*n; j++)
    {
        if(array[i]>array[j] && i%2==0 )
        {
            cs=array[i];
            array[i]=array[j];
            array[j]=cs;
            cs2=array[i+1];
            array[i+1]=array[j+1];
            array[j+1]=cs2;
        }
    }
}
即使您遵循 @Federico klez Culloca 的建议,也没有意义。

考虑n等于1的情况。当您的示范阵列出现时

4 -6 // 2 10 3 0 1 9
-6 2 // 4 10 3 0 1 9 

至少尝试访问数组之外​​的内存。

如果我已正确理解了赋值,那么您可以使用标题qsort中声明的标准C函数<stdlib.h>,而不是编写自己的冒泡排序实现,如演示程序中所示。

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

int cmp_pair(const void *p, const void *q)
{
    const int *lhs = (const int *)p;
    const int *rhs = (const int *)q;

    return (*rhs < *lhs) - (*lhs < *rhs);
}

int main( void )
{
    const size_t n = 4;
    int a[2 * n] = { 4, -6, 2, 10, 3, 0, 1, 9 };

    for (size_t i = 0; i < 2 * n; i++) printf("%d ", a[i]);
    putchar('\n');

    qsort(a, n, sizeof(int[2]), cmp_pair);

    for (size_t i = 0; i < 2 * n; i++) printf("%d ", a[i]);
    putchar('\n');
}

程序输出

4 -6 2 10 3 0 1 9
1 9 2 10 3 0 4 -6

或者如果要使用冒泡排序的实现,那么循环可以看起来像在此演示程序中显示的那样

#include <stdio.h>

int main( void )
{
    const size_t n = 4;
    int a[2 * n] = { 4, -6, 2, 10, 3, 0, 1, 9 };

    for (size_t i = 0; i < 2 * n; i++) printf("%d ", a[i]);
    putchar('\n');

    for ( size_t m = n, last = n; !( m < 2 ); m = last )
    {
        for ( size_t i = last = 1; i < m ; i++ )
        {
            if ( a[2 *i] < a[2 * ( i - 1)] )
            {
                int tmp[2] = { a[2 * i], a[2 * i + 1] };
                a[2 * i] = a[2 * (i - 1)];
                a[2 * i + 1] = a[2 * (i - 1) + 1];
                a[2 * (i - 1)] = tmp[0];
                a[2 * (i - 1) + 1] = tmp[1];
                last = i;
            }
        }
    }

    for (size_t i = 0; i < 2 * n; i++) printf("%d ", a[i]);
    putchar('\n');
}

输出与上面显示的相同。

4 -6 2 10 3 0 1 9
1 9 2 10 3 0 4 -6

您需要自己编写的是编写输入变量n的值的代码,并使用值填充数组。

答案 2 :(得分:0)

这是一种可能的解决方案尝试。我使用结构来包含数字对。我还从main()调用了我的函数。

#include<stdio.h>

typedef struct pairs{
  int numA;
  int numB;
}num_pair;

num_pair* create_num_pair_array(num_pair*, int);
void sort_pairs(num_pair*, int);
void print_num_pairs(num_pair*, int);

int main()
{
  int n;
  printf("Enter the number of pairs, n:\n");
  scanf("%d", &n);
  num_pair array[n];
  create_num_pair_array(array, n);
  sort_pairs(array, n);
  print_num_pairs(array, n);
  return 0;
}

num_pair* create_num_pair_array(num_pair* array, int arr_size)
{
  int i;
  printf("Enter the number pairs:\n");
  for(i = 0; i < arr_size; i++){
    printf("Enter first number for number pair %d: ", i+1);
    scanf("%d", &array[i].numA);
    printf("Enter second number for number pair %d: ", i+1);
    scanf("%d", &array[i].numB);
  }
  return array;
}

void sort_pairs(num_pair* array, int arr_size)
{
  int i, j;
  num_pair temp;
  temp.numA = 0;
  temp.numB = 0; 
  for(i = 0; i < (arr_size - 1); i++){
    for(j = 0; j < arr_size - i - 1; j++){
      if(array[j].numA > array[j+1].numA){
      temp.numA = array[j].numA;
      temp.numB = array[j].numB;
      array[j] = array[j+1];
      array[j+1].numA = temp.numA;
      array[j+1].numB = temp.numB; 
      }
    }
  }
}

void print_num_pairs(num_pair* array, int arr_size)
{
  int i;
  for(i = 0; i < arr_size; i++){
    printf("%d %d\n", array[i].numA, array[i].numB);
  }
}