在学习C语言时,必然会学到的一种排序,就是冒泡排序。
从键盘输入数字并降序排列
冒泡排序的意思是相邻的两个元素进行比较,如果前面的元素小于后面的元素,则把两个元素的位置调换;反之则不做调整。
***首先***要考虑的是如何从键盘输入数字,并且把数字有序的存起来。这就要用到scanf(),将数组从键盘输入;使用数组将输入的数字存起来。
***其次***需要考虑如何对已有的数组升序排列。两个数字的比较并且是同一个数组,这就需要for循环,并且是两个for循环实现。
***最后***重要的问题解决了,那就需要用代码实现。以下是我写的一个关于冒泡升序排列的一个代码。
#include<stdio.h>
#include<Windows.h>
#pragma warning(disable:4996)
void Order(int a,int arr[]){
int term = 0;
for (int j = 0; j < a - 1; j++){//排序
for (int i = j + 1; i < a; i++){
if (arr[j] < arr[i]){
term = arr[j];
arr[j] = arr[i];
arr[i] = term;
}
}
}
printf("排列大小后:\n");
for (int i = 0; i < a; i++){
printf("%d\n", arr[i]);
}
}
int main(){
int *arr;
int a = 0;
printf("请输入数字的个数:\n");
scanf("%d", &a);
arr = (int*)malloc(a*sizeof(int));//分配a个整型类型的空间,用arr指向该空间。
for (int i = 0; i < a; i++){
printf("请输入第%d数字:", i + 1);
scanf("%d", &arr[i]);
}
Order(a, arr);
system("pause");
return 0;
}
以上是实现的结果。排序的功能使用了一个函数,
term = arr[j];
arr[j] = arr[i];
arr[i] = term;
使用了一个容器 ,先将前面比较小的数字放到term里,然后arr[j]的内容为空,将arr[i]的值付给arr[j],然后将term的值赋给arr[j]。这就实现了两个数字位置的调换。
因为相邻的元素要比较,所以在最坏的情况下,是将所有的元素两两相邻比较一轮之后,只能将一个元素放到指定位置,即找到最小的(最大的)。然后还需要比较第二轮找到次小的…以此类推,假设有n个数字比较,则需要n-1+n-2+…+1.其实是数组总的第一个元素依次和后面的每一个元素比较,第二个元素和后面的每一个元素比较…这两个所进行比较的次数是相同的。所以使用两个for循环实现冒泡排序的算法。
以上,欢迎指正哦。