繁体   English   中英

排序功能无法正常工作(气泡排序)-c

[英]sort function not working properly (bubble sort) - c

我的排序功能遇到了一些麻烦,该功能也使用交换功能工作。 我一直试图找到我的错误,但找不到它。 其余代码工作完美,只有sort函数不起作用(它不对任何东西进行排序。)

如果有人对如何解决我的问题有任何想法,我将在此处保留代码。

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

void sort(int *values, int n);
void swap(int arr[], int i);
void populate(int arr[]);
const int arraysize = 10;


int main()
{

    srand((long int) time(NULL));

    int ela[10] = {0};

    populate(ela); // populates with random values

    printf("before func\n");
    for(int i = 0; i < arraysize; i++)
    {
        printf("%i\n", ela[i]); 
    }


    sort(ela, arraysize); // this is the function that is not working

    printf("\n\nafter func\n");

    for(int i = 0; i < arraysize; i++)
    {
        printf("%i\n", ela[i]); 
    }

    return 0;
}





void sort(int *values, int n)
{
int count = 1;
    while(count != 0)
    {
        count = 0;
        for (int i = 0; i < n; i++) {

            if(values[i] > values[(i + 1)] && values[(i + 1)] != '\0')
            {
                swap(values, i);
                count++;
            }
            if (count == 0) break;
        }

    }

}

void swap(int arr[], int i)
{
    int save = arr[i];
    arr[i] = arr[i+1];
    arr[i + 1] = save;
    return;
}

void populate(int arr[])
{
    for(int i = 0; i < arraysize; i++)
    {
        arr[i] = (rand() % 15);
    }
}
void sort(int *values, int n)
{
int count = 1;
    while(count != 0)
    {
        count = 0;
        for (int i = 0; i < n-1; i++) {

            if(values[i] > values[(i + 1)] )
            {
                swap(values, i);
                count++;
            }
            //if (count == 0) break;

        }

    }

}

我怀疑这永远不是真正的values[(i + 1)] != '\\0'因为这些值是整数。所以运行for循环直到条件i<n-1会在您交换i+1正常工作与i i+1元素。
并且if (count == 0) break; 应该删除for循环中的内容,因为如果有2 3 2 1类的输入,循环就会中断,因此无法排序。

工作中的Ideone: http ://ideone.com/k1LJau

这是sort()函数的更新版本:

void sort(int *values, int n)
{
int count = 1;
    while(count != 0)
    {
        count = 0;
        for (int i = 0; i < n; i++) {

            if(values[i] > values[(i + 1)] && values[(i + 1)] != '\0')
            {
                swap(values, i);
                count++;
            }
        }
    }
}

您的if(count==0) break; 即使您检查数组的初始值,该语句也会退出for循环。 因此,例如[5 6 9 8]将退出,因为当检查前两个项目时count为0。

如果要使用sort()函数,则必须添加算法头文件。 但这不适用于c。 如果using namespace std;添加using namespace std; 然后它将起作用。 然后您必须这样打电话。

sort(ela, ela+arraysize);

您可以按以下方式编辑排序功能。 以上答案也不错。

void Sort(int *values, int n)
{
    int cnt=0;
    while(1)
    {
        cnt++;
        if(cnt==n-1)
            break;
        for (int i = 0; i < n-cnt; i++)
        {

            if(values[i] > values[(i + 1)] && values[(i + 1)] != '\0')
            {
                swap(values, i);
            }
        }

    }

}

您的气泡排序功能是错误的。

这是一个演示程序,显示了如何编写函数

#include <stdio.h>

void swap( int a[], size_t i )
{
    int tmp = a[i];
    a[i] = a[i+1];
    a[i+1] = tmp;
}

void bubble_sort( int a[], size_t n )
{
    for ( _Bool sorted = 0; n-- != 0 && !sorted;  )
    {
        sorted = 1;
        for ( size_t i = 0; i < n; i++ )
        {
            if ( a[i+1] < a[i] )
            {
                sorted = 0;
                swap( a, i );
            }
        }
    }
}

int main(void) 
{
    int a[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
    const size_t N = sizeof( a ) / sizeof( *a );

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

    bubble_sort( a, N );

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

    return 0;
}

输出是

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM