冒泡排序
原理:比较相邻两个数,将较大的数移至右边。
思路:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
如: 排序[3,2,5,4,1]
- 两两交换相邻的数字进行交换,大的数字移到右边,故3和2交换位置;[2,3,5,4,1]
- 然后重复上述工作,3和5比较,不用交换,故第一轮下来结果为[2,3,4,1,5]
- 第二轮结果为[2,3,1,4,5]
- 经过N-1轮排序,也就是4轮,完成排序[1,2,3,4,5]
代码如下:
核心代码:
public static void BubbleSort(int[] target) {
if(target==null||target.length<2){
return;
}
int length = target.length;
// 这里for循环表示总共需要比较多少轮
for (int i = 0; i < length; i++) {
//这里for循环表示每轮比较需要参与元素的数量
for (int j = 0; j < length - i -1; j++) {
if (target [j] > target [j+1]) {
int temp = target[j+1];
target [j+1] = target[j];
target [j] = temp;
}
}
//第i轮排序的结果为
System.out.print("第"+i+"轮排序后的结果为:");
display(target);
}
}
完整测试代码:
public class Main {
public static void main(String[] args) {
// write your code here
int[] target = {3,2,5,4,1};
System.out.println("未排序数组顺序为:");
display(target);
System.out.println("-----------------------");
BubbleSort(target);
System.out.println("-----------------------");
System.out.print("最终的排序结果:");
display(target);
}
public static void BubbleSort(int[] target) {
if(target==null||target.length<2){
return;
}
int length = target.length;
// 这里for循环表示总共需要比较多少轮
for (int i = 0; i < length; i++) {
//这里for循环表示每轮比较需要参与元素的数量
for (int j = 0; j < length - i -1; j++) {
if (target [j] > target [j+1]) {
int temp = target[j+1];
target [j+1] = target[j];
target [j] = temp;
}
}
//第i轮排序的结果为
System.out.print("第"+i+"轮排序后的结果为:");
display(target);
}
}
//显示数组
public static void display(int[] array){
for(int i = 0 ; i < array.length ; i++){
System.out.print(array[i]+" ");
}
System.out.println();
}
}
最终结果:
未排序数组顺序为:
3 2 5 4 1
-----------------------
第0轮排序后的结果为:2 3 4 1 5
第1轮排序后的结果为:2 3 1 4 5
第2轮排序后的结果为:2 1 3 4 5
第3轮排序后的结果为:1 2 3 4 5
第4轮排序后的结果为:1 2 3 4 5
-----------------------
最终的排序结果:1 2 3 4 5
解释及分析:
解释:本来应该是 5 轮排序的,因为第 4 轮排序之后已经是有序数组了。所以,N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次;
冒泡排序是由两个for循环构成,第一个for循环的变量 i 表示总共需要多少轮比较,第二个for循环的变量 j 表示每轮参与比较的元素下标【0,1,......,length-i】,因为每轮比较都会出现一个最大值放在最右边,所以每轮比较后的元素个数都会少一个,这也是为什么 j 的范围是逐渐减小的。
性能分析: