我正在尝试编写一个代码,让用户编写自己的数字并决定是否要按升序或降序对它们进行排序,并使用冒泡排序对它们进行排序。这是我到目前为止所写的内容(也就是明显的入口);
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n, a, number;
printf("Enter your numbers. Write -1 to stop. \n");
do {
scanf("%d", &a);
} while(a != -1);
printf("Enter 1 if you want them to be in ascending order. Enter 2 if you want descending order\n");
scanf("%d", &a);
if(a = 1)
do {
system("PAUSE");
return 0;
}
我的问题是,我真的不知道如何合并冒泡排序。在所有的例子中,我都可以找到已预先设置好的数组。我想我应该从for结构开始,但我不知道。
编辑:
我已经来到这里了,感谢帮助,它有点“有效”,直到我写1或2然后它崩溃。有什么建议吗?
#include <stdio.h>
#include <stdlib.h>
int main()
{
int myarray[100],index,a,b,swap,turn;
index=0;
printf("Enter your numbers. Write -1 to stop. \n");
do{
scanf("%d", &myarray[index]);
index++;
}while(myarray[index-1] != -1);
printf("Enter 1 if you want them to be in ascending order. Enter 2 if you want descending order\n");
scanf("%d",&b);
if(b == 1) {
for(turn=1; turn <= myarray[100] -1; turn++)
for(index = 0; index <= myarray[100]; index++)
{
if (myarray[index] > myarray[index+1]){
swap = myarray[index];
myarray[index] = myarray[index+1];
myarray[index+1] = swap; }
}
}
else {
for(turn=1; turn <= myarray[100] -1; turn++)
for(index = 0; index <= myarray[100]; index++)
{
if (myarray[index] < myarray[index+1]){
swap = myarray[index];
myarray[index] = myarray[index+1];
myarray[index+1] = swap; }
}
}
system("PAUSE");
return 0;
}
答案 0 :(得分:2)
您将输入存储到单个变量a
中,每次读取更多输入时都会被覆盖。您应该存储每个输入,以便程序知道所提供的所有输入,而不仅仅是提供的最后一个输入。
数组是一组连续排列的相同类型的变量,并使用单个名称和索引进行访问。
int arr[10];
在此示例中,arr
组成了10个int
秒。您使用int
访问数组中的第一个arr[0]
,使用arr[9]
访问最后一个a
。要将输入输入到数组中,可以将arr
存储到#define MAX_ARR 10
int a;
int entered = 0;
int arr[MAX_ARR];
while (entered < MAX_ARR) {
if (scanf("%d", &a) != 1) break;
if (a == -1) break;
arr[entered] = a;
++entered;
}
if (entered == MAX_ARR) {
printf("No more room in the array (max is %d)\n", MAX_ARR);
}
的正确索引中。您可以通过计算用户目前输入的数量来维护正确的索引。计数将用作输入数组的索引。不允许用户超出声明中定义的数组边界,或者当您尝试将数据存储在与数组关联的最后位置之外时,您将调用未定义的行为(当发生这种情况时,称为缓冲区溢出)。 / p>
在读入数组输入后,可以将数组传递给冒泡排序函数。
假设您有一个这样的输入例程:
scanf
我们检查过entered
已返回预期的返回值。我们已根据停止值检查输入,并确保用户无法输入比数组可容纳的数据更多的数据。
输入数组的元素数量为int i;
for (i = 0; i < entered; ++i) {
printf("arr[%d] = %d\n", i, arr[i]);
}
。因此,为了迭代数组,循环看起来像这样:
int j, swaps, unsorted = entered;
do {
swaps = 0;
for (j = 1; j < unsorted; ++j) {
/* ... if arr[j-1] and arr[j] need to swap then:
swap them, and
increment swaps ... */
}
} while (swaps > 0);
冒泡排序的一个非常简单的版本就是保持循环遍历数组,直到您不必再进行交换。只要两个连续元素不符合所需顺序,您就会进行交换。对于升序案例:
unsorted
你知道数组最后一个位置的元素将在一个完整的通过冒泡循环结束时处于其排序位置,因此在每次完整传递后,{{1}}的数量可以减少。
答案 1 :(得分:2)
你是正确的,你需要将这些数字存储在某种数据结构中,如数组或向量。向量是一个不错的选择,因为您不知道用户将输入多少个数字。这是您可以应用于代码的草图:
#include <vector>
int main()
{
// ...
std::vector<int> userInts;
// ... get input
userInts.push_back(a); // add int to the end of the list
bubbleSort(userInts);
// ...
}
编辑:我没有意识到这被标记为C而不是C ++。只需用一些代码替换std::vector
调用,即可在C(或您自己的向量实现)中动态分配数组。或者,如果您只知道 N 整数将被输入,则声明int userInts[N]
,循环输入,将其插入数组,然后排序。
EDITx2:如上所述,请参阅@ user315052的答案,使用固定长度数组执行此操作。
答案 2 :(得分:1)
对于第一个版本,有一个固定大小的数组说
int myarray[100];
//Accept the integers
index=0;
do {
scanf("%d", &myarray[index]);
index++;
} while(myarray[index-1]!= -1);
现在您拥有数组和总数的计数 要素 - (index-1)
您可以在阵列上应用排序算法。
答案 3 :(得分:0)
#include <stdio.h>
#include <stdlib.h>
typedef enum _order {
Ascending=1, Descending
} order;
void swap(int *x, int *y){
int wk;
wk=*x;*x=*y;*y=wk;
}
int needSwap(int x, int y, order dir){
if(dir == Ascending)
return x > y;
if(dir == Descending)
return x < y;
return 0;
}
void bubbleSort(int *array, int top, int end, order dir){
int i, j, swaped;
for(i = top; i < end; ++i){
swaped = 0;
for(j = top + 1; j <= end - i; ++j)
if(needSwap(array[j-1], array[j], dir)){
swap(&array[j-1], &array[j]);
swaped = 1;
}
if(swaped == 0)break;
}
}
int main(){
int myarray[100], index, order;
index=0;
printf("Enter your numbers. Write -1 to stop. \n");
do{
scanf("%d", &myarray[index++]);
}while(myarray[index-1] != -1 && index < 100);
--index;//Correction to point to the final value
printf("Enter 1 if you want them to be in ascending order.\n"
"Enter 2 if you want descending order\n");
scanf("%d",&order);
bubbleSort(myarray, 0, index-1, order);
{//result print
int i;
for(i=0;i<index;++i)
printf("%d ", myarray[i]);
printf("\n");
}
system("PAUSE");
return 0;
}