简介:本文用C语言实现冒泡排序。
code
#include <stdio.h>
void bubble_sort(int arr[], int n)
{
int i, j, temp;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j+1])
{
// 交换相邻元素的位置
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
int main()
{
int arr[] = {5, 4, 3, 2, 1};
int n = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, n);
printf("Sorted array: ");
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
这个代码定义了一个bubble_sort()函数,接受一个整数数组和数组的长度作为输入,然后使用嵌套循环遍历数组,并比较相邻元素的大小,如果前一个元素大于后一个元素,则交换它们的位置,直到数组完全排序为止。
在main()函数中,我们定义了一个整数数组并使用bubble_sort()函数对它进行排序。最后,我们打印出排序后的数组。
注意,在实际应用中,冒泡排序可能不是最优的排序算法,因为它的时间复杂度为O(n^2),而更快的排序算法,如快速排序和归并排序,通常具有更好的性能。
分析
该代码首先包含了一个头文件stdio.h,这个头文件包含了printf()函数的声明。
接下来定义了一个名为bubble_sort的函数,它接受一个整数数组和数组的长度作为输入,并使用嵌套循环遍历数组,并比较相邻元素的大小,如果前一个元素大于后一个元素,则交换它们的位置,直到数组完全排序为止。
在main函数中,我们定义了一个整数数组arr,并使用sizeof运算符计算了数组的长度。然后,我们调用bubble_sort函数对数组进行排序。
最后,我们使用printf函数打印出排序后的数组。
需要注意的是,该代码存在以下缺陷:
没有对数组的长度进行验证,如果长度为0或1,冒泡排序不会进行排序,这将导致程序不必要的计算和时间浪费。
代码中只使用了一个简单的固定大小的数组进行排序,如果数组太大,可能会导致内存不足。因此,可能需要使用动态内存分配函数来动态创建数组,并在排序结束后释放内存。
冒泡排序时间复杂度为O(n^2),当输入规模非常大时,可能会变得非常缓慢。如果需要排序大规模数据,可以考虑使用更高效的排序算法,如快速排序、归并排序、堆排序等。
详细分析
以下是对上面C语言冒泡排序代码的详细分析:
1:头文件引用
#include <stdio.h>
这个头文件包含了标准输入/输出函数printf()的声明。
2:函数定义
void bubble_sort(int arr[], int n)
{
int i, j, temp;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j+1])
{
// 交换相邻元素的位置
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
这是一个名为bubble_sort的函数,接受一个整数数组和数组的长度作为输入,用冒泡排序算法对数组进行排序。具体实现:首先定义三个变量i、j和temp,分别表示两个循环变量和一个中间变量。第一个循环变量i从数组的第一个元素开始循环,一直到倒数第二个元素,第二个循环变量j也从数组的第一个元素开始循环,直到倒数第i+1个元素。内部的if语句判断当前元素与下一个元素的大小关系,如果前一个元素大于后一个元素,则交换它们的位置。每次循环结束后,最大的元素都会被移到了数组的末尾。直到i循环完所有元素,排序完成。
3:main函数
int main()
{
int arr[] = {5, 4, 3, 2, 1};
int n = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, n);
printf("Sorted array: ");
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
这是程序的主函数。首先定义一个整数数组arr,包含了5个元素,然后使用sizeof运算符计算了数组的长度。接着调用bubble_sort函数对数组进行排序。最后,使用printf函数打印出排序后的数组。
4:缺陷
该代码没有对数组的长度进行验证,如果长度为0或1,冒泡排序不会进行排序,这将导致程序不必要的计算和时间浪费。
代码中只使用了一个简单的固定大小的数组进行排序,如果数组太大,可能会导致内存不足。因此,可能需要使用动态内存分配函数来动态创建数组,并在排序结束后释放内存。