C语言 仅使用while和if对数组进行排序

uxh89sit  于 2023-06-21  发布在  其他
关注(0)|答案(3)|浏览(144)

当我尝试运行程序时收到一条消息。为什么?

Segmentation fault

我的代码:

#include <stdio.h>

void sort_array(int *arr, int s);

int main() {
    int arrx[] = { 6, 3, 6, 8, 4, 2, 5, 7 };

    sort_array(arrx, 8);
    for (int r = 0; r < 8; r++) {
        printf("index[%d] = %d\n", r, arrx[r]);
    }
    return(0);
}

sort_array(int *arr, int s) {
    int i, x, temp_x, temp;
    x = 0;
    i = s-1;
    while (x < s) {
        temp_x = x;
        while (i >= 0) {
            if (arr[x] > arr[i]) {
                temp = arr[x];
                arr[x] = arr[i];
                arr[i] = temp;
                x++;
            }
            i++;
        }
        x = temp_x + 1;
        i = x;
    }
}

我认为问题出在if语句中。你觉得呢?为什么会这样呢?我想我是以积极的方式使用指向数组的指针的。
谢谢你!

o3imoua4

o3imoua41#

你程序中的这个循环

while (i >= 0) {
        //...
        i++;
    }

没有意义,因为i无条件增加。
该程序可以如下所示

#include <stdio.h>

void bubble_sort( int a[], size_t n )
{
    while ( !( n < 2 ) )
    {
        size_t i = 0, last = 1;

        while ( ++i < n )
        {
            if ( a[i] < a[i-1] )
            {
                int tmp = a[i]; 
                a[i] = a[i-1];
                a[i-1] = tmp;
                last = i;
            }
        }

        n = last;
    }
}   

int main( void ) 
{
    int a[] = { 6, 3, 6, 8, 4, 2, 5, 7 };
    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;
}

程序输出为

6 3 6 8 4 2 5 7 
2 3 4 5 6 6 7 8

如果你希望排序函数只有一个while循环,那么你可以用下面的方法实现它

void bubble_sort( int a[], size_t n )
{
    size_t i = 0;

    while ( ++i < n )
    {
        if ( a[i] < a[i-1] )
        {
            int tmp = a[i]; 
            a[i] = a[i-1];
            a[i-1] = tmp;
            i = 0;
        }
    }
}
ugmeyewa

ugmeyewa2#

在内部循环中,将i递增到数组大小之外。您的算法应该要求您减少i,但我不确定这是否足以修复排序算法。
你应该首先尝试用一个while循环来实现 * 冒泡排序 *,在这个循环中,你可以比较相邻的项,并在每次交换它们时后退一步。

2wnc66cl

2wnc66cl3#

**Simplest Way**

  function sort(arr) {
  for (let i = 0; i < arr.length; i++) {
  for (let j = 0; j < arr.length; j++) {
   if (arr[j] < arr[j + 1]) {
    [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
   }
  }
 }
  return arr;
   }
 console.log("2 sort array descending", sort(arr));

相关问题