我试图按降序进行冒泡排序,但我不断得到奇怪的输出。当我在数组中输入元素时,对于元素 1,它多次询问我元素 1,这会导致接收一个额外的元素,另一件事是最终元素根本不包含在数组中,我不明白。这是我的完整程序的输出,我的代码位于它下面:
输入:
How many elements in your array?: 4
Enter elements in your array:
Element 0:
97
32
Element 1:
13
Element 2:
22
Element 3:
244
Element 0: 32
Element 1: 13
Element 2: 22
Element 3: 0
我的代码:
#include <stdio.h>
void sort(int array[], int n);
int main() {
int num = 0;
printf("How many elements in your array?: ");
scanf("%d",&num);
while(num > 9)
{
printf("Only enter an array that is size 9 or less.\n");
printf("Enter a new number: ");
scanf("%d", &num);
}
int array[num];
printf("Enter elements in your array: \n");
for(int i = 0; i < num; i++)
{
printf("Element %d: \n",i);
scanf("%d ",&array[i]);
}
sort(array, num);
for(int j = 0; j < num; j++)
{
printf("Element %d: %d\n", j, array[j] );
}
return 0;
}
void sort(int array[], int size)
{
int temp;
for(int i = 0; i < size; i++)
{
/*if(array[i] > array[i+1]) // smallest to biggest
{
*temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}*/
if(array[i] > array[i+1]) // 1 2
{
temp = array[i];
array[i] = array[i+1];
array[i+1] = temp;
}
}
}
最佳答案
除了注释之外,您的“冒泡排序”永远不会排序,因为它不是冒泡排序。变量的冒泡排序实现类似于:
int i, j, swap;
for (i = 0; i < size - 1; i++) {
for (j = 0; j < size - i - 1; j++) {
if (array[j] > array[j + 1]) { /* For decreasing order use < */
swap = array[j];
array[j] = array[j + 1];
array[j + 1] = swap;
}
}
}
话虽如此,您对 scanf
的使用充满了陷阱。您必须验证scanf
的返回以确定(1)用户是否通过使用Ctrl+d生成手动EOF
来取消输入(或windoze 上的Ctrl+z)?; (2) 是否存在输入或匹配失败导致未发生转换?; (3) 如果转换成功,该值是否在可接受的范围内?在您的情况下,将采取以下形式:
int num = 0,
rtn;
for (;;) { /* loop continually until valid input received */
printf ("\nHow many elements in your array?: ");
rtn = scanf ("%d", &num);
if (rtn == EOF) {
fprintf (stderr, "user canceled input.\n");
return 1;
}
else if (rtn == 0) {
int c;
fprintf (stderr, "error: invalid input.\n");
/* discard any characters that remain after input failure */
for (c = getchar(); c != '\n' && c != EOF; c = getchar()) {}
}
else if (num > 9) {
fprintf (stderr, "error: elements must be 9 or less.\n");
}
else
break;
}
(注意:输入失败后,您必须丢弃 stdin
中保留的所有字符,否则,在下一次迭代中,您的转换将再次失败,导致无限循环——使用 scanf
进行用户输入的主要陷阱之一)
您可以对数组值进行简短检查(而不是循环直到获得正确的输入,您只是放弃,这可以消除丢弃字符等)。但是,您没有理由不能在该循环中实现完全健壮的解决方案(实现完整的检查和循环,直到所有数组元素都被填充或用户取消输入)。
printf("\nEnter elements in your array: \n");
for (int i = 0; i < num; i++) {
printf("Element[%2d]: ", i);
if (scanf("%d",&array[i]) != 1) {
fprintf (stderr, "error: invalid input.\n");
return 1;
}
}
将所有部分放在一起,您可以执行类似于以下的操作:
#include <stdio.h>
void sort(int *array, int size);
int main (void) {
int num = 0,
rtn;
for (;;) { /* loop continually until valid input received */
printf ("\nHow many elements in your array?: ");
rtn = scanf ("%d", &num);
if (rtn == EOF) {
fprintf (stderr, "user canceled input.\n");
return 1;
}
else if (rtn == 0) {
int c;
fprintf (stderr, "error: invalid input.\n");
for (c = getchar(); c != '\n' && c != EOF; c = getchar()) {}
}
else if (num > 9) {
fprintf (stderr, "error: elements must be 9 or less.\n");
}
else
break;
}
int array[num]; /* VLA for array */
printf("\nEnter elements in your array: \n");
for (int i = 0; i < num; i++) {
printf("Element[%2d]: ", i);
if (scanf("%d",&array[i]) != 1) {
fprintf (stderr, "error: invalid input.\n");
return 1;
}
}
sort (array, num);
putchar ('\n');
for(int j = 0; j < num; j++)
printf("Element %d: %d\n", j, array[j]);
return 0;
}
void sort(int *array, int size)
{
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (array[j] > array[j + 1]) { /* For decreasing order use < */
int swap = array[j];
array[j] = array[j + 1];
array[j + 1] = swap;
}
}
}
}
示例使用/输出
$ ./bin/bubblesort_input
How many elements in your array?: twenty
error: invalid input.
How many elements in your array?: 12
error: elements must be 9 or less.
How many elements in your array?: 6
Enter elements in your array:
Element[ 0]: 12
Element[ 1]: 2
Element[ 2]: -12
Element[ 3]: -4
Element[ 4]: 5
Element[ 5]: 1
Element 0: -12
Element 1: -4
Element 2: 1
Element 3: 2
Element 4: 5
Element 5: 12
仔细检查一下,如果您还有任何其他问题,请告诉我。
关于c - 冒泡排序不排序和额外元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48969871/