冒泡 选择 插入 交换排序算法 分析
package sort;
/**
* 给予比较法的 排序算法 冒泡 插入 选择
* 关于排序算法的 衡量
* <p>
* 最好 最坏 平均时间复杂度
* 同级别算法的 系数常数低阶
* 比较或者移动的次数
* <p>
* Describe:
* Author: 九霄道长
* CreateTime: 2021/12/3 14:08
*/
public class Sort {
public static int[] array = {1, 5, 3, 6, 4, 2};
// 最好 On 级别 平均 最坏 On2 级别
// 冒泡排序,a表示数组,n表示数组大小
public static void bubbleSort(int[] a, int n) {
//数组长度小于等于1 则直接返回
if (n <= 1) {
return;
}
//外层循环 控制循环次数
for (int i = 0; i < n; i++) {
boolean flag=false;
//里层缓存控制 循环了第几次 以及最后的几个元素不用再去比较
for (int j = 0; j < n - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
flag = true;
}
}
//说明没有数据交换 直接返回即可
if (!flag) {
return;
}
}
for (int i = 0; i < n; i++) {
System.out.println(a[i]);
}
}
// 最好 On 级别 平均 最坏 On2 级别
// 插入排序,a表示数组,n表示数组大小
public static void insertionSort(int[] a, int n) {
if (n <= 1) {
return;
}
//外层循环控制 循环次数
for (int i = 1; i <n ; i++) {
int j=i-1; // j 是已经排序的区间
int value=a[i]; //要排序的 值
for (; j >=0 ; j--) { //在已排序的区间内比较
if (a[j]>value){
a[j+1]=a[j]; //数据交换 把大的值向后移动
}else {
break;
}
}
// 值该被插入的地方
a[j+1]=value;
}
for (int i = 0; i <n ; i++) {
System.out.println(a[i]);
}
}
// 最好 On2 级别 平均 最坏 On2 级别
public static void selectionSort(int[] a , int n){
if (n<1){
return;
}
//控制循环次数
for (int i = 0; i <n ; i++) {
//当前的最小值默认为 i
int min =i;
//内层比较 从 i的下一个开始 i以前的是已经排好序的
for (int j = i+1; j < n; j++) {
if (a[j]<a[min]){
min=j;//交换坐标 找出最小值
}
}
//找出最小值后判断是否成立交换位置
if (i!=min){
int temp =a[min];
a[min] = a[i];
a[i]=temp;
}
}
for (int i = 0; i < n; i++) {
System.out.println(a[i]);
}
}
public static void main(String[] args) {
selectionSort(array, array.length);
}
}