繁体   English   中英

我的冒泡排序输出有问题

[英]Something is wrong with my bubble sort output

这只是一个普通的冒泡排序代码,但其中有问题。

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

void bubble_sort(int size, int *arr);

int main(void)
{
    int *array, size;

    printf("enter the amount of data: ");
    scanf("%d", &size);

    array = (int*)malloc(sizeof(int) * size);

    for (int i = 0; i < size; ++i)
    {
        scanf("%d", &array[i]);
    }

    bubble_sort(size, array);

    for (int i = 0; i <= size; ++i)
    {
        printf("%d ", array[i]);
    }

    printf("\n");

    return 0;
}

void bubble_sort(int size, int *arr)
{
    for (int i = 0; i < size; ++i)
    {
        for (int j = 0; j < size; ++j)
        {
            if (arr[j] > arr[j + 1])
            {
                int temp;
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
            else if (arr[j] == arr[j + 1])
            {
                continue;
            }
        }
    }
}

当我执行它时,当它必须打印时,输出中会出现一个零1 2 3

[my_username@my_computer bubble_sort]$ ./bubble_sort 
enter the amount of data: 3
3 1 2
0 1 2 3
^
|
Where are this zero came from?

好吧,这不是冒泡排序

首先,正如评论中指出的那样: arr[j + 1]使用无效索引访问数组 - 当j处于最大值( size - 1 )时,数组末尾超过了一个。

打印数组的循环

for(int i = 0; i <= size; ++i)

有一个类似错误。 i < size是所需的条件。

越界访问数组会调用Undefined Behavior

排序中的else if块是多余的。


冒泡排序的简化变体通常写成:

void bubble_sort(int *array, size_t length)
{
    for (size_t i = 0; i < length; i++) {
        for (size_t j = i + 1; j < length; j++) {
            if (array[i] > array[j]) {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }
}

而标准的冒泡排序如果在没有交换的情况下通过数组就会停止。

void bubble_sort(int *array, size_t length)
{
    int swapped;

    do {
        swapped = 0;

        for (size_t i = 1; i < length; i++) {
            if (array[i - 1] > array[i]) {
                int temp = array[i - 1];
                array[i - 1] = array[i];
                array[i] = temp;
                swapped = 1;
            }
        }
    } while (swapped);
}

这可以通过观察最后一次交换之后的所有元素都已经排序来优化。

void bubble_sort(int *array, size_t length)
{
    do {
        size_t n = 0;

        for (size_t i = 1; i < length; i++) {
            if (array[i - 1] > array[i]) {
                int temp = array[i - 1];
                array[i - 1] = array[i];
                array[i] = temp;
                n = i;
            }
        }

        length = n;
    } while (length);
}

暂无
暂无

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

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