![](/img/trans.png)
[英]Why my bubble sort function of linked list sometimes output a wrong result while sometimes seems like to be an infinite loop?
[英]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.