首先,我们要确定一个目标:在我们乱序输入十个数字后,通过数组内元素逐一比较,最终实现从小到大排序。
先要创建一个数组,然后将十个数字输入到自定义数组中去,这时就得写一个循环来实现,见下:
我们是知道这个数组里面有十个数字的,所以直接使用10就行,但是,这也得我们提前就知道的情况下才能这样用,所以不具有普遍性,这时候,我们就要对此进行推广,那如何实现推广呢?
我们可以使用 sizeof 来计算整个数组的大小,然后用整个数组的大小来除以这个数组中某一个元素的大小,这样,就可以知道数组中有多少个数了,如下:
接下来,就是引用函数来进行冒泡排序了,我们的思路是,先一个数与除这个数以外的数逐一进行排序,简称:进行一趟冒泡排序,然后再将第二个数与除这个数和第一个数以外的数再进行第二趟冒泡排序,以此类推,在第九趟的时候,无论如何,都会实现从小到大的排序,具体代码见下:
这时候会发现,这里为什么是 j<sz-1-i 呢?因为在拍后面的数的时候,并不需要再考虑要不要和之前已经冒泡排序好的数进行比较,之前就已经比较好了,就像前面所说的,是除自己本身和之前已经执行过的数以外,进行冒泡排序的,这样做可以在必要的时候大大的提高效率。
最后,再一次使用循环将已经排序好数字的数组打印出来,方法与输入的时候类似,见下:
所以,冒泡排序的完整代码为:
#include <stdio.h>
void bubble_sort(int* arr, int sz)
{
int i = 0;
int j = 0;
int ret = 0;
for (i = 0; i < sz - 1; i++)
{
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
ret = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = ret;
}
}
}
}
int main()
{
int arr[10] = { 0 };
int n = 0;
for (n = 0; n < 10; n++)
{
scanf("%d", &arr[n]);
}
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
for (n = 0; n < sz; n++)
{
printf("%d ", arr[n]);
}
return 0;
}
这个代码也没什么好推广的,唯一值得改进的就是,不把数组限制在十个元素,而应该是无论输入多少个数,都可以进行排序。