【问题标题】:sort function not working properly (bubble sort) - c排序功能无法正常工作(冒泡排序) - c
【发布时间】:2015-03-27 18:31:09
【问题描述】:

我的排序函数也使用交换函数工作时遇到了一些问题。我一直试图找到我的错误,但找不到它。其余代码完美运行,只有排序功能不起作用(它不会对任何内容进行排序。)

如果有人对如何解决我的问题有任何想法请回复。

#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);
    }
}

【问题讨论】:

  • 仅供参考,您永远不会在外循环中减少 n。每次扫描都会使一个元素冒泡到最后,从而减少再次击中该单元格或任何经过它的单元格的需要。 while (count &amp;&amp; n--) 是首先想到的。

标签: c arrays sorting bubble-sort


【解决方案1】:
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&lt;n-1 可以正常工作,因为你正在用 i 交换 i+1 元素。
而且你的for循环中的if (count == 0) break;也应该被删除,因为如果有一些像2 3 2 1这样的输入,循环就会中断,所以不会排序。

工作理念:http://ideone.com/k1LJau

【讨论】:

    【解决方案2】:

    这是您的 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。

    【讨论】:

      【解决方案3】:

      如果你想使用sort()函数,你必须添加算法头文件。但它不适用于c。如果您添加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);
                  }
              }
      
          }
      
      }
      

      【讨论】:

        【解决方案4】:

        你的冒泡排序函数是错误的。

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

        #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 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多