c语言-冒泡排序
冒泡排序原理:
冒泡排序是一种简单直观的排序算法,它重复地遍历待排序的元素序列,比较相邻的两个元素,如果它们的顺序不符合要求(例如升序要求前面的元素小于后面的元素),则交换它们的位置。遍历整个序列的过程会多次进行,每一轮都会把一个最大(或最小,取决于排序顺序)的元素“浮”到最右侧。
具体过程如下:
-
比较相邻元素: 从第一个元素开始,比较相邻的两个元素的大小。
-
交换元素位置: 如果顺序不符合要求(例如升序时前面的元素大于后面的元素),则交换它们的位置。
-
一轮结束: 一轮比较和交换之后,最大的元素已经被“浮”到最右侧。
-
重复步骤1-3: 重复执行上述步骤,每次都会确定一个未排序部分的最大元素的位置。
-
终止条件: 当整个序列都有序时,排序完成。
冒泡排序的特点:
-
稳定性: 冒泡排序是稳定的排序算法,相等元素的相对位置在排序前后不会改变。
-
时间复杂度: 最坏情况下的时间复杂度为 O(n^2),最好情况下的时间复杂度为 O(n)。
-
空间复杂度: 冒泡排序仅需要常数级的额外空间。
尽管冒泡排序的性能相对较差,但由于其简单易懂的特点,适用于对数据量较小的序列进行排序。在实际应用中,对于大规模数据集,通常会选择更高效的排序算法,如快速排序或归并排序。
用c语言进行冒泡排序时,遇到的问题:
下面是时隔很久用c写出的代码:(错误的)
#include<stdio.h>
int main(){
int arr[]={2,1,5,6,3,4};
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(arr[j]>arr[j+1]){
arr[j]=arr[j+1];
}
}
}
print("输出序列:",arr[j]);
}
代码存在以下几点错误:
-
没有定义变量
n
,我假设n
是数组的长度,因此在代码中添加了int n = sizeof(arr) / sizeof(arr[0]);
。 -
在冒泡排序中,当发现
arr[j] > arr[j+1]
时,应该交换它们的值,而不是将arr[j]
赋值为arr[j+1]
。因此,我修改了相应的代码。 -
在
printf
函数中,应该使用小写的printf
,而不是print
。
修改后的代码如下:
#include<stdio.h>
int main() {
int arr[] = {2, 1, 5, 6, 3, 4};
int n = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1-i; j++) {
if (arr[j] > arr[j+1]) {
// 交换 arr[j] 和 arr[j+1] 的值
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
printf("输出序列:");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
在标准的冒泡排序算法中,内层循环的终止条件通常是 n - 1 - i,其中 i 是外层循环的当前迭代次数。这是因为在每一轮外层循环之后,数组的最后 i 个元素已经被确定为最大的 i 个元素,所以内层循环无需再遍历这些已经确定位置的元素。
这样的代码应该能够正确地对数组进行冒泡排序,并输出排序后的序列。