搞懂排序算法-冒泡排序
1冒泡排序
算法思想
- 从头开始比较每一对相邻元素,如果第一个比第二个大,就交换他们的位置,执行完一轮后,最末尾的元素就是最大的元素。这个过程就像一个泡泡慢慢向上冒,因此称为冒泡排序。
- 忽略第一步中找到的最大元素,重复执行步骤1,直到全部元素有序。
1.1基础冒泡
public static void bubbleSort(int[] array){
//定义冒泡到哪,也就是末尾已经拍好序的不参与比较
for (int end = array.length - 1; end > 0; end--){
//一轮冒泡
for (int begin = 0; begin < end; begin++){
//交换
if (array[begin] > array[begin+1]){
int temp = array[begin];
array[begin] = array[begin+1];
array[begin+1] = temp;
}
}
}
}
1.2冒泡优化1
优化1:如果数组有序,提前结束扫描
也就是,如果数组经过一次扫描就变成有序的,希望程序可以终止,而不是继续扫描。
代码:
public static void bubbleSort(int[] array){
//定义冒泡到哪,也就是末尾已经拍好序的不参与比较
for (int end = array.length - 1; end > 0; end--){
//假定此轮扫描的数组是有序的
boolean sorted = true;
//一轮冒泡
for (int begin = 0; begin < end; begin++){
//交换
if (array[begin] > array[begin+1]){
int temp = array[begin];
array[begin] = array[begin+1];
array[begin+1] = temp;
//进入if程序,说明数组无序
sorted = false;
}
}
//终止程序
if (sorted){
break;
}
}
}
1.3冒泡优化2
需求:尾部局部有序,较少比较次数
冒泡优化1是在数组全部完全有序才能进行优化,而全部完全有序的情况是比较少的。因此冒泡优化2对此进行了改进,如果数组尾部已经局部有序,可以记录最后一次交换的位置,减少比较的次数
思路:肯定是改变第一层循环的位置,也就是动end指针
/**
* 优化2:如果数组尾部局部有序,则后面不参与比较;未优化前,end是end--
* 优化后让每次让end等于尾部排好序的第一个数字(也就是交互的最后一个数字)
* @param array
*/
public static void bubbleSort2(Integer[] array){
//定义冒泡到哪,也就是末尾已经拍好序的不参与比较
for (int end = array.length - 1; end > 0; end--){
//sortedIndex=1;如果本身就是有序则直接停止冒泡
int sortedIndex = 1;
//一轮冒泡
for (int begin = 0; begin < end; begin++){
//交换
if (array[begin] > array[begin+1]){
int temp = array[begin];
array[begin] = array[begin+1];
array[begin+1] = temp;
sortedIndex = begin + 1;
}
}
end = sortedIndex;
}
}
注:仅用于学习交流