054-056 冒泡排序
054 冒泡排序算法思路图解
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相信元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就旬水底下气泡一样逐渐向上冒。
因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行交换,就说明序列有序
,因此要在排序过程中设置一个标志 flag 判断是否进行交换,从而减少不必要的比较
055 冒泡排序算法代码实现
package com.old.sort_054_056;
import java.util.Arrays;
/**
* 一共进行数组的大小 -1 次大的循环
* 每一趟的排序的次数在逐渐减少
*/
public class BubbleSort {
public static void main(String[] t) {
int arr[] = {
3, 9, -1, 10, -2};
/**
* 为了容易理解,把冒泡排序的演变过程展示
*
* 第一趟排序就是将最大的数排在最后
*/
//临时变量
int temp = 0;
for (int j = 0; j < arr.length - 1 ; j++){
//如果前面的数比后面的数在,交换
if (arr[j] > arr[j + 1]){
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第一趟排序:");
System.out.println(Arrays.toString(arr));
//第二趟排序,就是将第二大的数,排在第二位
for (int j = 0; j < arr.length - 1 - 1 ; j++){
//如果前面的数比后面的数在,交换
if (arr[j] > arr[j + 1]){
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第二趟排序:");
System.out.println(Arrays.toString(arr));
for (int j = 0; j < arr.length - 1 - 2 ; j++){
//如果前面的数比后面的数在,交换
if (arr[j] > arr[j + 1]){
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第三趟排序:");
System.out.println(Arrays.toString(arr));
for (int j = 0; j < arr.length - 1 - 3 ; j++){
//如果前面的数比后面的数在,交换
if (arr[j] > arr[j + 1]){
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第四趟排序:");
System.out.println(Arrays.toString(arr));
System.out.println();
//冒泡排序的时间复杂度 O(n^2)
arr = new int[]{
3, 9, -1, 10, -2};
for (int i = 0; i < arr.length - 1; i++) {
/*
还需要减 1,是因为 如果 j 数组的长度 - i
第一次遍历 长度-i,此时i是0,减i=数组长度,
而j<小于数组长度,当j到了数组长度的最后一个,即j=长度 - 1
而if中,将 取出 j 的下一个,即等于 长度,这样就出现了数组越界
*/
for (int j = 0; j < arr.length - i - 1; j++) {
//如果前面的数比后面的数在,交换
if (arr[j] > arr[j + 1]){
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第" + (i+1) + "趟排序:");
System.out.println(Arrays.toString(arr));
}
System.out.println("冒泡排序-最终结果:");
System.out.println(Arrays.toString(arr));
}
}
056 冒泡排序算法优化和总结
主要思路在于如果一次都没有进行交换就跳出循环,不再进行交换,因为没有进行交换就代表数组已经是顺了。因为每次遍历都从头开始遍历,遍历的次数少的只是数组尾
package com.old.sort_054_056;
import java.util.Arrays;
/**
* 一共进行数组的大小 -1 次大的循环
* 每一趟的排序的次数在逐渐减少
*/
public class BubbleSort {
public static void main(String[] t) {
int arr[] = {
3, 9, -1, 10, -2};
/**
* 为了容易理解,把冒泡排序的演变过程展示
*
* 第一趟排序就是将最大的数排在最后
*/
//临时变量
int temp = 0;
for (int j = 0; j < arr.length - 1; j++) {
//如果前面的数比后面的数在,交换
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第一趟排序:");
System.out.println(Arrays.toString(arr));
//第二趟排序,就是将第二大的数,排在第二位
for (int j = 0; j < arr.length - 1 - 1; j++) {
//如果前面的数比后面的数在,交换
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第二趟排序:");
System.out.println(Arrays.toString(arr));
for (int j = 0; j < arr.length - 1 - 2; j++) {
//如果前面的数比后面的数在,交换
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第三趟排序:");
System.out.println(Arrays.toString(arr));
for (int j = 0; j < arr.length - 1 - 3; j++) {
//如果前面的数比后面的数在,交换
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("第四趟排序:");
System.out.println(Arrays.toString(arr));
System.out.println();
arr = new int[]{
3, 9, -1, 10, -2};
arr = new int[]{
3, 9, -1, 10, 20};
//arr = new int[]{1, 2, 3,4, 5};
//标识变量,表示是否进行过交换
boolean flag = false;
for (int i = 0; i < arr.length - 1; i++) {
/*
还需要减 1,是因为 如果 j 数组的长度 - i
第一次遍历 长度-i,此时i是0,减i=数组长度,
而j<小于数组长度,当j到了数组长度的最后一个,即j=长度 - 1
而if中,将 取出 j 的下一个,即等于 长度,这样就出现了数组越界
*/
for (int j = 0; j < arr.length - i - 1; j++) {
//如果前面的数比后面的数在,交换
if (arr[j] > arr[j + 1]) {
flag = true;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
if (flag == false) {
//说明一次都没有发生
break;
} else {
//重置,进行下次的判断,如果不重置会一直是true,就没有效了
flag = false;
}
System.out.println("第" + (i + 1) + "趟排序:");
System.out.println(Arrays.toString(arr));
}
System.out.println("冒泡排序-最终结果:");
System.out.println(Arrays.toString(arr));
System.out.println();
arr = new int[]{
3, 9, -1, 10, -2};
sort(arr);
}
/**
* 这种情况也只可以,将外层从 1 开始,小于等于数组长度,内层循环无需再减1
*/
public static void sort(int[] arr) {
//临时变量
int temp = 0;
//标识变量,表示是否进行过交换
boolean flag = false;
//这里变为了 从1开始,i小于等于 数组长度减1
for (int i = 1; i <= arr.length - 1; i++) {
//里面的循环也没有减1了
for (int j = 0; j < arr.length - i; j++) {
//如果前面的数比后面的数在,交换
if (arr[j] > arr[j + 1]) {
flag = true;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
if (flag == false) {
break;
} else {
flag = false;
}
System.out.println("第" + (i) + "趟排序:");
System.out.println(Arrays.toString(arr));
}
System.out.