c冒泡排序代码
冒泡排序是一种简单的排序算法,它重复地遍历待排序的元素列表,比较相邻的两个元素,并将它们交换位置,直到整个列表都是有序的。这个过程会多次重复,每次遍历都会把最大的元素浮到最后,因此称为冒泡排序。
以下是冒泡排序的Python代码示例:
pythondef bubble_sort(arr):
n = len(arr)
# 外层循环控制遍历次数
for i in range(n):
# 标记,用于提前退出循环
swapped = False
# 内层循环进行比较和交换
for j in range(0, n - i - 1):
if arr[j] > arr[j + 1]:
# 交换元素
arr[j], arr[j + 1] = arr[j + 1], arr[j]
swapped = True
# 如果内层循环没有发生交换,说明已经排序完成,提前退出外层循环
if not swapped:
break
# 测试示例
arr = [64, 34, 25, 12, 22, 11, 90]
bubble_sort(arr)
print("排序后的数组:", arr)
这段代码定义了一个bubble_sort
函数,它接受一个待排序的列表作为参数,并对其进行排序。在内层循环中,相邻的元素比较并交换,如果没有发生交换,说明列表已经有序,可以提前退出外层循环,以提高效率。
运行上述代码后,将会输出排序后的数组。冒泡排序是一种简单但效率较低的排序算法,对于大型数据集不是最佳选择,但对于小型数据集或教学示例非常有用。
冒泡排序的特性和优化:
时间复杂度: 冒泡排序的平均和最坏情况时间复杂度都为O(n^2),其中n是待排序元素的数量。这使得它不适合对大型数据集进行排序。
稳定性: 冒泡排序是稳定的排序算法,即相等元素的相对顺序在排序后不会改变。
适用场景: 冒泡排序在实际应用中不常用,但它的教学价值很高,因为它易于理解和实现。
优化: 冒泡排序可以进行一些优化,如设置一个标志来检查是否发生了交换,如果没有发生交换,就可以提前退出外层循环。这样可以减少不必要的比较操作。另外,可以记录每轮最后一次发生交换的位置,下一轮只需要比较到这个位置即可,进一步提高效率。
冒泡排序的基本原理在不同编程语言中都是相同的,只是语法有所不同。以下是一些常见编程语言中的冒泡排序示例:
C语言:
c#include <stdio.h>
void bubble_sort(int arr[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (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[0]);
bubble_sort(arr, n);
printf("排序后的数组: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
return 0;
}
Java语言:
javapublic class BubbleSort {
public static void bubbleSort(int arr[]) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 交换元素
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
public static void main(String[] args) {
int arr[] = {64, 34, 25, 12, 22, 11, 90};
bubbleSort(arr);
System.out.print("排序后的数组: ");
for (int num : arr) {
System.out.print(num + " ");
}
}
}
这些示例展示了如何在C语言和Java中实现冒泡排序。不同编程语言之间的主要区别在于语法和数组的处理方式,但冒泡排序的核心逻辑保持不变。