冒泡排序
1、算法描述
给定一个数组,用第一个元素与第二个元素比较,如果大于第二元素,则交换,接下来,比较第二个和第三个,依次到最后一个元素。如果有给定的数组元素有n个,那么需要重复n-1次上面的过程。为何为冒泡算法,因为每一轮的比较,都是由相邻两个元素比较交换,把大元素依次的交换到最后一个元素,如同气泡冒出水面
2、算法简单实现
3、代码实现
/**
* @author xuwanglu
* @Description: 冒泡排序
* @date 2019/1/20 5:05 PM
* <p>
* 冒泡排序:给定一个数组,使用数组第一个元素和第二个元素比较,大则交换,小则不变,在第二个和第三比较,依次把最大的冒泡到最后一个元素。这样就把最大元素冒泡到最后了。
* 后面则依次把第一个到倒数二个元素冒出第二大元素,依次排序完。时间复杂度为O(n2)
*/
public class BubbleSort {
public static void bubbleSort(int[] array) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length - i - 1; j++) {
if (array[j] > array[j + 1]) {
SwapUtils.swap(j, j + 1, array);
}
}
}
}
public static void main(String[] args) {
int[] array = {2, 4, 6, 0, 11, 3, 5, 6, 3};
BubbleSort.bubbleSort(array);
PrintUtils.print(array);
}
}
4、优化
当如果给定[1,2,3,4,5,6]数组时,则在原来的冒泡排序下,还是需要n-1轮比较,其实这已有序,不需要比较了,那么这种情况我么可以在内循环加一个标记,记录一轮比较下来是否有发生元素交换,如果没有则说明有序,无需继续下面的比较。
/**
* 优化后冒泡排序
* 如果一趟下来都没有交换的化,那么说明已经有序了,所以可以加一个标记,查看是否一趟下来有交换,没有的化则不需要比较了
*
* @param array
*/
public static void bubbleSortWithOptimized(int[] array) {
for (int i = 0; i < array.length; i++) {
int flag = 0;
for (int j = 0; j < array.length - i - 1; j++) {
if (array[j] > array[j + 1]) {
flag++;
SwapUtils.swap(j, j + 1, array);
}
}
if (flag == 0) {
break;
}
}
}