一、冒泡排序的详解
1、每一次循环结束后,都要找出最大的数据,放到参与比较的这堆数据的最右边。(冒出最大的气泡)
2、核心:拿着左 边的数字和右边的数字比对,当左边 > 右边的时候,交换位置
3、举例说明:int[] arr = {1,4,6,3,9,5,0};
第一次循环,参与比较的数据:1,4,6,3,9,5,0
第一次排序:1,4,6,3,9,5,0
(1和4比较,1小于4,不交换位置)
第二次排序:1,4,6,3,9,5,0
(4和6比较,4小于6,不交换位置)
第三次排序:1,4,3,6,9,5,0
(6和3比较,6大于3,交换位置)
第四次排序:1,4,3,6,9,5,0
(6和9比较,6小于9,不交换位置)
第五次排序:1,4,6,3,5,9,0
(9和5比较,9大于5,交换位置)
第六次排序:1,4,6,3,5,0,9
(9和0比较,9大于0,交换位置)
最终冒出的最大数据在最右边:9
-----------------------------------------------------------------------------------
第二次循环,参与比较的数据:1,4,6,3,5,0
第一次排序:1,4,6,3,5,0
(1和4比较,1小于4,不交换位置)
第二次排序:1,4,6,3,5,0
(4和6比较,4小于6,不交换位置)
第三次排序:1,4,3,6,5,0
(3和6比较,6大于3,交换位置)
第三次排序:1,4,3,5,6,0
(6和5比较,6大于5,交换位置)
第三次排序:1,4,3,5,0,6
(6和0比较,6大于0,交换位置)
最终冒出的最大数据在最右边:0
之后依次类推
二、选择排序的详解
1、每一次从这堆参与比较的数组当中找出最小值,
拿着这个最小值和最前面的元素交换位置。
2、选择排序比冒泡排序好在:每一次交换位置都是有意义的
3、举例说明:int[] arr = {1,4,6,3,9,5,0};
第一次比较:
参与比较的数据:1,4,6,3,9,5,0
第1次循环的结果:0,4,6,3,9,5,1
最小的数据为0,用0和最前面的数据交换位置
第二次比较:
参与比较的数据:4,6,3,9,5,1
第2次循环的结果:1,6,3,9,5,4
最小的数据为1,用1和最前面的数据交换位置
之后依次类推
三、冒泡排序与选择排序的比较
冒泡排序:
public static void main(String[] args) {
int[] arr = {1,4,6,3,9,5,0};
int count = 0; // 测试比较次数
int count2 = 0; // 测试交换位置次数
for (int i = arr.length-1; i > 0; i--) {
for (int j = 0; j < i; j++) {
count ++;
if (arr[j] > arr[j+1]){ // 交换位置
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
count2 ++;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println("比较次数="+count); // 21
System.out.println("交换位置次数="+count2); // 10
}
2、选择排序:
public static void main(String[] args) {
int[] arr = {1,4,6,3,9,5,0};
int count = 0; // 测试比较次数
int count2 = 0; // 测试交换位置次数
for (int i = 0; i < arr.length - 1; i++) {
// i = 0,1,2,3,4,5
// i 正好是“参与比较的数组”最左边元素的下标
// 假设起点i下标元素是最小的
int min = i;
for (int j = i+1; j < arr.length; j++) {
count ++;
if (arr[j]<arr[min]){
min = j; // 最小元素的下标为j
}
}
// 当i和min相等时,表示猜测是正确的
// 当i和min不相等时,表示猜测是错误的,存在更小的元素
// 需要拿着这个更小的元素跟最左边的元素进行交换
if (min != i){
count2 ++;
int temp = arr[min];
arr[min] = arr[i];
arr[i] = temp;
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println("比较次数="+count); // 21
System.out.println("交换位置次数="+count2); // 6
}
总结:同样的数组,冒泡排序与选择排序的比较次数相等,交换次数选择排序比冒泡排序少,不过,在Java中,我们可以调用Arrays类中的sort方法,即Arrays.sort(数组名),来完成冒泡排序