package com.zsx.algorithm.sort;
import java.util.Arrays;
/**
* @author Zsx
* 冒泡排序
* 双层嵌套循环,时间复杂度 O(n^2)
* 判断过程示例:
* 初始数据:[6,5,4,3,2,1]
* 从小到大排序
* 第一遍排序:遍历 长度=length 的数组,将大的和小的通过临时变量交换位置,直到遍历完成,遍历后数组如下: [5,4,3,2,1,6]
* 第二遍排序:遍历 长度=length-1 的数组,因为最大值已经是最后一个了,所以只需要遍历前面 lengt-1 ,遍历后数组如下: [4,3,2,1,5,6]
* 第三遍排序:遍历 长度=length-2 的数组,结果:[3,2,1,4,5,6]
* 第四遍排序:遍历 长度=length-3 的数组,结果:[2,1,3,4,5,6]
* 第五遍排序:遍历 长度=length-4 的数组,结果:[1,2,3,4,5,6]
* ...故执行length-1次排序,每次排序遍历只遍历前 length-1-n的数,将最大值放到遍历数据的最后一位,n再+1
* <p>
* 优化点:当执行某次排序的遍历,发现没有元素交替。说明已经是排好序的,则直接跳出方法
* @Time 2021/6/18 15:10
*/
public class BubblesSort {
public static void main(String[] args) {
//需要排序的数组
int[] arr = {1, 3, 2, 4, 20, 5, 7, 1, 2, 24, 9};
System.out.println("初始数据:" + Arrays.toString(arr));
System.out.println();
BubblesSort bubblesSort = new BubblesSort();
//正常排序
bubblesSort.sort(arr);
System.out.println();
//优化后的排序
bubblesSort.sort1(arr);
System.out.println();
System.out.println("最终结果:" + Arrays.toString(arr));
}
/**
* 正常冒泡排序
*
* @param arr 需要排序的数组
*/
public void sort(int[] arr) {
//定义临时变量-->用于交换
int temp;
//排序过n次 -->每次排序少遍历最后的n个数据
int n = 0;
//执行length-1次排序
for (int i = 0; i < arr.length - 1; i++) {
//每次排序遍历 length - 1 - n
for (int j = 0; j < arr.length - 1 - n; j++) {
//元素交替
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println("遍历第" + i + "次:" + Arrays.toString(arr));
n++;
}
}
/**
* 冒泡排序优化
*
* @param arr 需要排序的数组
*/
public void sort1(int[] arr) {
//定义临时变量-->用于交换
int temp;
//排序过n次 -->每次排序少遍历最后的n个数据
int n = 0;
//是否已经排序好了
boolean isSorted = true;
//执行length-1次排序
for (int i = 0; i < arr.length - 1; i++) {
//每次排序遍历 length - 1 - n
for (int j = 0; j < arr.length - 1 - n; j++) {
//元素交替
if (arr[j] > arr[j + 1]) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
//每次元素交替,isSorted就变为false
isSorted = false;
}
}
System.out.println("遍历第" + i + "次:" + Arrays.toString(arr));
//验证本次是否发生元素交替(也就是验证是否已经是排好序的数组)
if (isSorted) {
//无需再遍历
System.out.println("第" + i + "次遍历提前完成");
return;
}
//重置
isSorted = true;
n++;
}
}
}