【问题标题】:Bubble sort Descending and Ascending in C won't sortC中的冒泡排序降序和升序不会排序
【发布时间】:2014-10-12 22:39:03
【问题描述】:

我让用户选择是按升序还是降序对元素进行排序。我知道我的代码可以对元素进行正确排序,但是在 main 的某个地方,我认为我在调用函数以正确顺序打印升序/降序元素时犯了错误。还是我必须像 bubble_sort 函数中那样使用另一个 if 语句?我需要这样做,以便 Main 函数将最终结果打印给用户。这是我得到的输出: 输入元素数量 3 输入 3 个整数 43 7 90 输入排序顺序 请输入 A 升序或 D 降序 d 降序排列的列表: 43 7 90

#include <stdio.h>

void bubble_sort(long [], char n);

int main()
{
    long array[100], n, c;

    printf("Enter number of elements\n");
    scanf("%ld", &n);

    printf("Enter %ld integers\n", n);
    for (c = 0; c < n; c++)
        scanf("%ld", &array[c]);

    printf("Enter sort order\n");
    fflush(stdin);
    printf("Please enter A for ascending or D for descending order\n");
    scanf("%ld", &n);
    bubble_sort(array, n);
    printf("Sorted list in descending order:\n");
    for ( c = 0 ; c < n ; c++ )
    {
        printf("%ld\n", array[c]);
    }
    fflush(stdin);
    getchar();
    return 0;
}

void bubble_sort(long list[], char n)
{
    long c, d, temp;

    if(n=='a' || n=='A')
    {
        for (c = 0 ; c < ( n - 1 ); c++)
        {
            for (d = 0 ; d < n - c - 1; d++)
            {
                if (list[d] > list[d+1])
                {
                    temp = list[d];
                    list[d] = list[d+1];
                    list[d+1] = temp;
                }
            }
        }
    }
    if(n=='d' || n=='D')
    {
        long c, d, temp;

        for (c = 0 ; c < ( n - 1 ); c++)
        {
            for (d = 0 ; d > n - c - 1; d++)
            {
                if (list[d] < list[d+1])
                {/* Swapping */
                    temp = list[d];
                    list[d] = list[d+1];
                    list[d+1] = temp;
                }
            }
        }
    }
}

编辑:在这里我添加了一个交换函数,这样升序/降序逻辑更有效。但我似乎混淆了我认为是一个大问题的变量的使用。有人会指出并帮助我理解我需要在哪里以及为什么需要使用这些变量吗?非常感谢!

#include <stdio.h>

void bubble_sort(int list[], int n, char c);
void swap(int x, int y, int array[]);
int main()
{
    int array[100], j, i;
    char c;
    printf("Enter number of elements\n");
    scanf("%d", &j);

    printf("Enter %d integers\n", j);
    for (i = 0; i < j; i++)
        scanf("%d", &array[i]);

    printf("Please enter A for ascending or D for descending order\n");
    scanf("%s", &c);

    bubble_sort(array, j, i);
    printf("Sorted list in descending order:\n");
    for (i = 0 ; i < j ; i++ )
    {
        printf("%d\n", array[i]);
    }
    getchar();
    return 0;
}

void bubble_sort(int list[], int n, char c)
{
    int i, j;

    if(c=='a' || c=='A'){
        for (i = 0; i < (n - 1); i++){
            for (j = 0; j < (n - i) - 1; j++){
                if (list[i] > list[j])
                {
                    swap(i, j, list);                }
            }
        }
    }
    if(c=='d' || c=='D') {
        for (i = 0 ; i < ( n - 1 ); i++) {
            for (j = 0 ; j > (n - i) - 1; j++) {
                if (list[i] < list[j])
                {
                    swap(i, j, list);
                }
            }
        }
    }
}

void swap(int x, int y, int array[])
{
    int hold; //temp hold a number

    hold = array[x];
    array[x] = array[y];
    array[y] = hold;
}

【问题讨论】:

  • 您同时使用 n 作为长度和选择,但这是两个不同的值。
  • 哦,剪切-粘贴!,你是一个残酷无情的小妞。
  • @WhozCraig 你在说什么?我已经在这个项目上工作了几个小时。请有礼貌!
  • @pointing_Stack 绝不是我对的任何批评。这只是一个声明,有时剪切-粘贴会导致我们甚至没有考虑过的缺陷。不幸的是,在那个小时内,您并没有感到奇怪,根据某些选项选择 C ​​对某个长度的序列进行排序 N 您的排序函数将需要序列、序列长度 N 、 和 i> 选择的选项 C。鉴于您的函数只需要两个参数,其中一个显然是缺失的。调试将有助于极大地注意到,如果您在查看代码时没有看到它。
  • @WhozCraig 感谢您澄清您的评论。现在很有帮助:)

标签: objective-c c bubble-sort


【解决方案1】:

在此声明中

printf("Please enter A for ascending or D for descending order\n");
scanf("%ld", &n);

您正在覆盖 n 中存储的值,在这些语句之前表示数组中元素的数量。您应该再声明一个 char 类型的变量并将其用于此代码 sn-p。

排序函数也应该声明为

void bubble_sort(long list[], int n, char c );

其中 n 是数组大小,c 是“A”或“D”

编辑:您的新代码包含许多拼写错误。试试下面的

#include <stdio.h>

void swap( int x, int y, int array[] )
{
    int hold; //temp hold a number

    hold = array[x];
    array[x] = array[y];
    array[y] = hold;
}

void bubble_sort( int list[], int n, char c )
{
    int i, j;

    if ( c == 'a' || c == 'A' )
    {
        for ( i = 0; i < n - 1; i++ )
        {
            for ( j = 0; j < n - i - 1; j++ )
            {
                if ( list[j] > list[j+1] )
                {
                    swap( j, j + 1, list);                
                }
            }
        }
    }

    if ( c=='d' || c=='D' ) 
    {
        for ( i = 0 ; i < n - 1; i++ ) 
        {
            for ( j = 0 ; j < n - i - 1; j++ ) 
            {
                if ( list[j] < list[j+1] )
                {
                    swap( j, j + 1, list);
                }
            }
        }
    }
}

int main(void) 
{
    int array[100], j, i;
    char c;

    printf("Enter number of elements: ");
    scanf( "%d", &j);

    printf( "Enter %d integers\n", j );
    for ( i = 0; i < j; i++ ) scanf( "%d", &array[i] );

    printf("Please enter A for ascending or D for descending order: ");
    scanf( " %c", &c );

    printf( "%c\n", c );

    bubble_sort( array, j, c );

    printf( "Sorted list in the selected order:\n" );
    for ( i = 0; i < j; i++ )
    {
        printf( "%d ", array[i] );
    }
    puts( "" );

    return 0;
}

【讨论】:

  • Spasibo za obesneniye!我进行了更改,但我认为总体而言我最大的问题是正确使用变量。你能检查我的编辑吗?它仍然提供相同的输出。
  • 我刚刚添加了它们 :) Khorosho,obyazatel'no proveryu!
  • @pointing_Stack 这个语句 scanf("%s", &c);已经无效。您必须使用格式说明符 %c。并且该函数必须被称为bubble_sort(array, j, c);
  • 我确实进行了这些更改,现在它甚至不会要求 A/D 选择。我想我在这里搞砸了一些更大的东西,我很难看到。
  • @pointing_Stack 读取字符的格式应在第一个引号后包含一个空格:scanf( " %c", &c );
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-21
相关资源
最近更新 更多