冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。冒泡排序的基本原...
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
冒泡排序的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。在C语言中,冒泡排序通常是通过两层嵌套循环实现的:
以下是一个使用C语言实现的简单冒泡排序的例子:
#include
void bubbleSort(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; } } }
}
void printArray(int arr[], int size) { int i; for (i=0; i < size; i++) printf("%d ", arr[i]); printf("\n");
}
int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr)/sizeof(arr[0]); bubbleSort(arr, n); printf("Sorted array: \n"); printArray(arr, n); return 0;
} 在每一趟排序中,如果没有发生任何交换,那么说明数组已经是有序的,可以提前终止排序。
int i, j, temp;
int swapped;
for (i = 0; i < n-1; i++) { swapped = 0; 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; swapped = 1; } } if (swapped == 0) break;
}随着排序的进行,未排序部分的元素会逐渐减少,因此内层循环的上界可以随着每一趟排序的进行而减小。
int i, j, temp;
for (i = 0; i < n-1; i++) { for (j = 0; j < n-1-i; j++) { if (arr[j] > arr[j+1]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } }
}除了提前终止排序,还可以使用一个标志位来标记每一趟排序中是否发生了交换,如果没有发生交换,则可以提前退出。
int i, j, temp;
int swapped;
for (i = 0; i < n-1; i++) { swapped = 0; for (j = 0; j < n-1-i; j++) { if (arr[j] > arr[j+1]) { temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; swapped = 1; } } if (swapped == 0) break;
}冒泡排序虽然简单,但在数据量较大时效率较低。在实际应用中,更推荐使用快速排序、归并排序等更高效的算法。然而,了解冒泡排序的基本原理和优化技巧对于学习和理解其他排序算法是非常有帮助的。