冒泡排序算法(冒泡排序python)
## 冒泡排序算法
简介
冒泡排序 (Bubble Sort) 是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。### 1. 算法原理冒泡排序的核心思想是:
比较相邻的元素,如果顺序错误则交换它们。重复此过程直到整个数组有序。
每次遍历都会将最大的(或最小的,取决于排序方向)未排序的元素移动到其最终位置。让我们以升序排序为例:1.
第一趟排序:
从数组的第一个元素开始,依次比较相邻的两个元素。如果前一个元素大于后一个元素,则交换它们。第一趟排序结束后,最大的元素会被移动到数组的末尾。2.
第二趟排序:
重复步骤 1,但这次只需要比较到倒数第二个元素,因为最大的元素已经在最后了。3.
后续趟排序:
继续重复步骤 1,每次比较的范围都缩小一个元素,直到整个数组有序。### 2. 算法步骤假设我们需要对数组 `arr` 进行升序排序:1.
初始化:
设置一个标志变量 `swapped`,初始值为 `false`。这个变量用来判断一趟排序中是否进行了交换。如果一趟排序中没有进行任何交换,则说明数组已经有序,可以提前结束排序。2.
外循环:
循环遍历整个数组,从 `i = 0` 到 `n-1` (n 为数组长度)。3.
内循环:
对于每一趟排序,循环遍历数组的未排序部分,从 `j = 0` 到 `n-i-1`。4.
比较和交换:
比较 `arr[j]` 和 `arr[j+1]`。如果 `arr[j] > arr[j+1]`,则交换它们,并将 `swapped` 设置为 `true`。5.
结束条件:
如果一趟排序后 `swapped` 仍然为 `false`,则说明数组已经有序,可以提前结束排序。### 3. 代码示例 (Python)```python def bubble_sort(arr):n = len(arr)swapped = Truefor i in range(n):if not swapped:breakswapped = Falsefor j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]swapped = Truereturn arr# Example usage my_list = [64, 34, 25, 12, 22, 11, 90] sorted_list = bubble_sort(my_list) print("Sorted array:", sorted_list) ```### 4. 算法分析
时间复杂度:
最佳情况 (数组已排序): O(n),最坏情况 (数组逆序): O(n²),平均情况: O(n²)
空间复杂度:
O(1) (原地排序算法)
稳定性:
稳定### 5. 优缺点
优点:
算法简单易懂,容易实现。
缺点:
效率低,时间复杂度为 O(n²) ,不适合处理大规模数据。
对于近乎有序的数组,效率会略微提高,但仍然不如其他高效排序算法。### 6. 应用场景由于其效率较低,冒泡排序在实际应用中并不常见。它主要用于教学目的,帮助理解排序算法的基本原理。 对于小规模数据集,或者作为其他更复杂算法的入门学习,冒泡排序还是有一定价值的。
冒泡排序算法**简介**冒泡排序 (Bubble Sort) 是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
1. 算法原理冒泡排序的核心思想是:**比较相邻的元素,如果顺序错误则交换它们。重复此过程直到整个数组有序。** 每次遍历都会将最大的(或最小的,取决于排序方向)未排序的元素移动到其最终位置。让我们以升序排序为例:1. **第一趟排序:** 从数组的第一个元素开始,依次比较相邻的两个元素。如果前一个元素大于后一个元素,则交换它们。第一趟排序结束后,最大的元素会被移动到数组的末尾。2. **第二趟排序:** 重复步骤 1,但这次只需要比较到倒数第二个元素,因为最大的元素已经在最后了。3. **后续趟排序:** 继续重复步骤 1,每次比较的范围都缩小一个元素,直到整个数组有序。
2. 算法步骤假设我们需要对数组 `arr` 进行升序排序:1. **初始化:** 设置一个标志变量 `swapped`,初始值为 `false`。这个变量用来判断一趟排序中是否进行了交换。如果一趟排序中没有进行任何交换,则说明数组已经有序,可以提前结束排序。2. **外循环:** 循环遍历整个数组,从 `i = 0` 到 `n-1` (n 为数组长度)。3. **内循环:** 对于每一趟排序,循环遍历数组的未排序部分,从 `j = 0` 到 `n-i-1`。4. **比较和交换:** 比较 `arr[j]` 和 `arr[j+1]`。如果 `arr[j] > arr[j+1]`,则交换它们,并将 `swapped` 设置为 `true`。5. **结束条件:** 如果一趟排序后 `swapped` 仍然为 `false`,则说明数组已经有序,可以提前结束排序。
3. 代码示例 (Python)```python def bubble_sort(arr):n = len(arr)swapped = Truefor i in range(n):if not swapped:breakswapped = Falsefor j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]swapped = Truereturn arr
Example usage my_list = [64, 34, 25, 12, 22, 11, 90] sorted_list = bubble_sort(my_list) print("Sorted array:", sorted_list) ```
4. 算法分析* **时间复杂度:** 最佳情况 (数组已排序): O(n),最坏情况 (数组逆序): O(n²),平均情况: O(n²) * **空间复杂度:** O(1) (原地排序算法) * **稳定性:** 稳定
5. 优缺点**优点:*** 算法简单易懂,容易实现。**缺点:*** 效率低,时间复杂度为 O(n²) ,不适合处理大规模数据。 * 对于近乎有序的数组,效率会略微提高,但仍然不如其他高效排序算法。
6. 应用场景由于其效率较低,冒泡排序在实际应用中并不常见。它主要用于教学目的,帮助理解排序算法的基本原理。 对于小规模数据集,或者作为其他更复杂算法的入门学习,冒泡排序还是有一定价值的。