/**
* @author longFei
* @since 2023/4/14 19:17
*/
public class ListTest {
public static void main(String[] args) {
List<Integer> list = Arrays.asList(5, 3, 8, 4, 19, 2);
// 排序前
System.out.println(Arrays.toString(list.toArray()));
// 排序
selectSort(list);
// 排序后
System.out.println(Arrays.toString(list.toArray()));
}
/**
* 冒泡排序算法
*/
public static void bubbleSort(List<Integer> list) {
System.out.println("===== 冒泡排序 =====");
int length = list.size();
for (int i = 1; i < length; i++) {
for (int j = 0; j < length - i; j++) {
int a = list.get(j);
int b = list.get(j + 1);
if (a > b) {
list.set(j, b);
list.set(j + 1, a);
}
}
}
}
/**
* 选择排序
* 遍历集合,找到最小的放在未排序的第一位
* 再从剩下的元素中继续执行上一步
*/
public static void selectSort(List<Integer> list) {
System.out.println("===== 选择排序 =====");
int length = list.size();
int minNum, minIndex;
for (int i = 0; i < length - 1; i++) {
minNum = list.get(i);
minIndex = i;
// 获取未排序的元素中最小的值
for (int j = i + 1; j < length; j++) {
if (minNum > list.get(j)) {
minNum = list.get(j);
minIndex = j;
}
}
// 将最小值排到未排序元素的第一位
list.set(minIndex, list.get(i));
list.set(i, minNum);
}
}
/**
* 插入排序
* 通过一个循环逐步将数组分为两部分,左侧已排序的,右侧待排序的
* 将右侧的元素逐个按照从大到小插入到左侧已排序的数组中
*/
public static void insertionSort(List<Integer> list) {
System.out.println("===== 插入排序 =====");
int length = list.size();
int selected, ordered;
// 遍历待比较的所有元素
for (int i = 1; i < length; i++) {
// 取本轮选择的元素
selected = list.get(i);
// 将本轮选择的元素与已排序的元素依次比较
// 若 selected < ordered,则二者交换,否则,跳出本次循环
for (int j = i - 1; j >= 0; j--) {
ordered = list.get(j);
if (selected < ordered) {
list.set(j + 1, ordered);
list.set(j, selected);
} else {
break;
}
}
}
}
/**
* 快速排序
* 通过选取一个基准元素将数组分为两部分,然后继续对这两部分进行快速排序,直到排序完成
*/
public static void quickSort(List<Integer> list, int start, int end) {
int i, j, pivot, temp;
if (start > end) {
return;
}
// 基准数
pivot = list.get(start);
i = start;
j = end;
while (i < j) {
// 从右向左
while (i < j && pivot < list.get(j)) {
j--;
}
// 从左向右
while (i < j && pivot > list.get(i)) {
i++;
}
// 交换左侧大于基准数的和右侧大于基准数的
if (i < j) {
temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
}
quickSort(list, start, j - 1);
quickSort(list, j + 1, end);
}
}