我正在尝试在用户输入数组值时对数组的值进行排序。
问题是我想避免尝试使用“冒泡”或“快速排序”方法。
这是我的代码及其工作方式:
int i, j, k;
int number;
for (i = 0; i < size; i = i + 1) {
printf("Give me the number #%d to add to the list: ", i + 1);
while (!scanf("%d", &list[i])) {
while(getchar() != '\n');
printf("You can't use chars!.\n");
printf("Give me the number #%d to add to the list: ", i + 1);
}
number = list[i];
if (number < list[i-1]) {
list[i-1] = list[i];
list[i] = number;
}
}
for (i = 0; i < size; i = i + 1) {
printf("%d,", list[i]);
}
我会得到什么:
How much numbers do you want to order? 5
Give me the number #1 to add to the list: 5
Give me the number #2 to add to the list: 4
Give me the number #3 to add to the list: 3
Give me the number #4 to add to the list: 2
Give me the number #5 to add to the list: 1
4,3,2,1,1,% // here is the problem, the expected output should be: 1,2,3,4,5 (for example, if I have 5,8,3,2,9 I should get: 2,3,5,8,9).
我希望能得到有关为什么我的代码无法正常工作的解释,并可能提出有关将来如何可视化此类问题的建议。
预先感谢您的帮助。
答案 0 :(得分:0)
如果要避免冒泡排序或插入排序,只需在每次输入后调用合并排序即可。那将使整个程序成为O(x * nlogn),其中n log n是合并排序的运行时间,x是输入循环的运行时间。
当前实现的问题在于,它无法正确排序其余元素。想象一下:
user inputs 2 --> array now has = [2]
user inputs 7 --> array now has = [2, 7]
user inputs 3 --> array now has = [2, 3, 7]
您看到这个数组如何将3放在2和7的中间吗?这意味着排序还必须将所有元素移到右侧。
您当前的实现不执行此操作。相反,您的实现只将元素从左侧移到右侧一次。
更糟糕的是,您的实现受到输入循环的限制。这意味着您仅在非常特定的局部范围内对数组进行排序,该范围受输入循环的限制。在数组实际范围内,而不是对数组进行排序。
如果用户输入以下数字会发生什么:2、7、4、1?您的循环不在第一个索引中,因此仅将1与值7和4进行比较。
答案 1 :(得分:0)
要使数组保持排序,您应该对每个输入数字进行(部分)插入排序。
只是让您想起了插入排序算法,它对第i次迭代执行以下操作:
您的代码存在问题,就是您的移位不正确。
您必须将大于新数字的所有数字向后移动,以便为新数字留出空间。但是您的代码只会移动最后一个数字。
int i, j, k;
int number;
for (i = 0; i < size; i = i + 1)
{
printf("Give me the number #%d to add to the list: ", i + 1);
while (!scanf("%d", &list[i]))
{
while (getchar() != '\n')
;
printf("You can't use chars!.\n");
printf("Give me the number #%d to add to the list: ", i + 1);
}
number = list[i];
/* Here's the point! Shift all numbers bigger than *number* to the back. */
for (j = i; j > 0 && number < list[j - 1]; j--)
{
list[j] = list[j - 1];
}
list[j] = number;
}
for (i = 0; i < size; i = i + 1)
{
printf("%d,", list[i]);
}
(请重新格式化,这只是我的IDE所做的事情。)