冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。冒泡排序原理冒泡...
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
冒泡排序的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。该算法的基本思想是:比较相邻的元素,如果第一个比第二个大(升序排序),就交换它们两个;对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。针对所有的元素重复以上的步骤,除了最后一个,因为所有元素已经排序完成。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
下面是冒泡排序的基本代码实现:
#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; } } }
} 尽管冒泡排序是一个简单的算法,但它并不是效率最高的排序算法。它的平均和最坏情况时间复杂度都是O(n^2),这意味着对于大型数据集来说,冒泡排序的性能并不理想。
可以通过在遍历过程中添加一个标志位来减少不必要的交换。如果在一次完整的遍历中没有发生任何交换,那么数组已经是有序的,可以提前结束排序。
#include
void optimizedBubbleSort(int arr[], int n) { int i, j, temp; bool swapped; for (i = 0; i < n-1; i++) { swapped = false; 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 = true; } } if (swapped == false) break; }
} 可以在内部循环中使用一个额外的标志位来标记已排序的部分,从而减少内部循环的次数。
#include
void flagOptimizedBubbleSort(int arr[], int n) { int i, j, temp; bool swapped; int newn; for (i = 0; i < n-1; i++) { swapped = false; newn = 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 = true; newn = j+2; } } n = newn; if (swapped == false) break; }
} 通过掌握冒泡排序的原理、优化技巧和实战方法,你可以更好地理解排序算法的工作原理,并在实际编程中灵活运用。