冒泡排序
冒泡排序
步骤
比较相邻的两个元素,如果后一个元素比前一个元素大,那么就交换两个元素,把大的放在后面。
对每一对相邻元素都做比较,这样一趟下来,最大的元素就放在最后了。
除了最后有序的部分,对剩下的元素持续上述步骤,直到没有任何一对元素需要比较交换,排序结束。
还有一个优化点,就是如果这一趟下来,没有发生任何交换,那么说明数组已经有序了,没必要再对剩下元素再做比较了。因此可以设置一个flag,判断是否需要继续比较。
Java代码
public void sort(int[] arr) {
if (null == arr || arr.length < 2) {
return;
}
for (int j = 1; j < arr.length; j++) {
boolean flag = true;
for (int i = 0; i < arr.length - j; i++) { // 一趟冒泡,把最大的数放在最后
if (arr[i] > arr[i + 1]) {
this.exchange(arr, i, i + 1);
flag = false;// 标识发生了交换
}
}
if (flag) { // 全程无交换
break;
}
}
}
优点
对于数组和链表,都可以用冒泡排序。因为冒泡排序是比较和交换相邻两个元素,这对链表和数组都是可行的。
冒泡排序是稳定的,也就是比较两个相邻元素相等,是不交换他们的位置的,两个元素的相对顺序不改变。
时间复杂度
最好O(n)
最差O(n^2)