冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。冒泡排序的基本步骤如下:
比较相邻的元素:
如果第一个比第二个大,就交换它们两个。
对每一对相邻元素做同样的工作:
从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤:
除了最后一个。
持续每次对越来越少的元素重复上面的步骤:
直到没有任何一对数字需要比较。
下面是冒泡排序的C语言实现:
```c
include
void bubbleSort(int arr[], int n) {
int i, j;
for (i = 0; i < n - 1; i++) {
for (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;
}
}
}
}
int main() {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
int n = sizeof(arr) / sizeof(arr);
bubbleSort(arr, n);
printf("Sorted array: \n");
for (i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
```
代码解释:
外层循环:
`for (i = 0; i < n - 1; i++)`,控制总的遍历次数,每次遍历都会将一个最大值放到正确的位置。
内层循环:
`for (j = 0; j < n - 1 - i; j++)`,每次遍历都会将下一个最大值放到正确的位置。
交换:
如果`arr[j] > arr[j + 1]`,则交换这两个元素的位置。
时间复杂度:
冒泡排序的时间复杂度为 \(O(n^2)\),其中 \(n\) 是数组的长度。
优化:
冒泡排序可以通过添加一个标志位来优化,当某一轮遍历没有发生交换时,说明数组已经有序,可以提前结束排序。
希望这个解释对你理解冒泡排序有所帮助!