冒泡排序
1、思想:冒泡排序的思想就是相邻的两个元素做比较,将值大的元素放在后面,小的放在前面。假设现有待排序列:{ 52, 38, 47, 24, 69, 05, 17, 38 }。第一次排序的过程如图1,第二次排序的过程如图2。第一次排序的比较区域是整个数组,第一次比较之后将最小的值5“冒”到了array[0]的位置,第二次比较的的时候只需要比较array[1]到array[7]之间的元素,然后依次循环。
图1
图2
2、代码实现(java)
package sort.baohuajie;
import java.util.Arrays;
/**
* @author 包华杰
*
* 2017年12月4日
*/
public class BubbleSort {
public static void bubbleSort(int[] array) {
int temp = 0;
for (int i = 0; i < array.length; i++) {
for (int j = array.length - 1; j > i; j--) {
if (array[j] < array[j - 1]) {
temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
}
}
System.out.println("第" + i + "次排序结果:" + Arrays.toString(array));
}
}
/**
* bubbleSort改进
* @param array
*/
public static void bubbleSort1(int[] array) {
int temp = 0;
int exchange = 0;
for (int i = 0; i < array.length; i++) {
/*
* 找出array[i]到array[array.length-1]
* 中最小的“浮上来”,并标记exchange = 1
* 表示这个过程中有交换,说明还没有完全按
* 顺序排列好
*/
for (int j = array.length - 1; j > i; j--) {
if (array[j] < array[j - 1]) {
//将小的值“浮上来”,即冒泡
temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
exchange = 1;
} else {
exchange = 0;
}
}
/*
* 如果exchange == 0说明array[i]到array[array.length-1]
* 是有序的,而此时array[0]到array[i]也是有序的,所以此时整个
* 序列都是有序的,结束程序
*/
if (exchange == 0) {
return ;
}
System.out.println("第" + i + "次排序结果:" + Arrays.toString(array));
}
}
public static void main(String[] args) {
int[] array = { 52, 38, 47, 24, 69, 05, 17, 38 };
// int[] array = { 5, 17, 24, 38, 38, 47, 52, 69 };
bubbleSort1(array);
System.out.println("最终排序结果:" + Arrays.toString(array));
}
}
3、程序解读
bubbleSort()函数的执行结果如下,我们发现从第5次开始已经是按照从小到大的规则排好了,但是后面又执行了第6、7次排序。针对这种情况博主搞了一个bubbleSort1()函数,其中增加一个exchange标识,记录排序过程中数据是否有交换,如果没有交换说明这个序列已经排排好了顺序,就可以直接结束函数了。
第0次排序结果:[5, 52, 38, 47, 24, 69, 17, 38]
第1次排序结果:[5, 17, 52, 38, 47, 24, 69, 38]
第2次排序结果:[5, 17, 24, 52, 38, 47, 38, 69]
第3次排序结果:[5, 17, 24, 38, 52, 38, 47, 69]
第4次排序结果:[5, 17, 24, 38, 38, 52, 47, 69]
第5次排序结果:[5, 17, 24, 38, 38, 47, 52, 69]
第6次排序结果:[5, 17, 24, 38, 38, 47, 52, 69]
第7次排序结果:[5, 17, 24, 38, 38, 47, 52, 69]
最终排序结果:[5, 17, 24, 38, 38, 47, 52, 69]
bubbleSort1()函数执行结果如下:
第0次排序结果:[5, 52, 38, 47, 24, 69, 17, 38]
第1次排序结果:[5, 17, 52, 38, 47, 24, 69, 38]
第2次排序结果:[5, 17, 24, 52, 38, 47, 38, 69]
第3次排序结果:[5, 17, 24, 38, 52, 38, 47, 69]
第4次排序结果:[5, 17, 24, 38, 38, 52, 47, 69]
第5次排序结果:[5, 17, 24, 38, 38, 47, 52, 69]
最终排序结果:[5, 17, 24, 38, 38, 47, 52, 69]
【下一篇】 常用排序算法之快速排序