给n个数字实现从大到小排序有两种方法,一是冒泡排序二是选择排序,这次先讲解冒泡排序。
先说明冒泡排序的逻辑(用10个数字举例)
由图可知每一趟冒泡排序都会将未进行排序的数字中最小的一位交换到最后
并且n个数字只需排好n-1个数字即可。所以n个数字需要n-1趟冒泡排序用循环实现,每一趟冒泡排序中有需要进行若干次(具体次数后续有说明)比较,又需用循环实现,所以要想实现完整的冒泡排序我们要用双层循环。在明白排序的逻辑以后我们用代码实现。
先在主函数中定义一个数组,在定义一个n,然后输入待排序数字的个数,最后用循环输入具体的数字。调用排序函数
int main()
{
int arr[20] = { 0 };
int n = 0, i = 0;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
bubble_sort(arr, n);
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
在排序函数中,首先我们需要确定外层循环的次数即需要多少趟冒泡排序,根据前面的分析图我们知道需要n-1趟冒泡排序,所以定义循环变量i。
内层循环是用来实现每一趟冒泡排序的具体过程,因为每次都是相邻两个数比较且都从第一个开始,所以j从0开始,每一趟所需的比较次数由分析图,也能推出是每趟待排序的数字总数减一,第一次待排序数字总数为n,第二次待排序总数为n-1,第三次为n-2,即每一趟待排序的数字总数为n-i,所以每一趟所需的比较次数为n-1-i。即j=0;j<n-1-i;j++
void bubble_sort(int arr[], int n)
{
int i = 0, j = 0, t = 0;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - 1 - i; j++) // 1 2 3
{
if (arr[j] < arr[j + 1])
{
t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
}
内层循环的比较如何实现:如果相邻两个数(arr[ j ], arr[ j+1 ])arr[ j ] < arr[ j+1 ],就将前一个数arr[ j ]赋给中间变量 t ,再将后一个数arr[ j+1 ]赋给前面那个数arr[ j ],最后再将中间变量 t 的数赋给后一个数arr[ j+1 ]就完成了一次交换。