冒泡排序
冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。关键点:
1)N个元素,有N轮冒泡
2)每一轮,都从第一个元素开始,依次与其下一个比较,是否需要交换
public void bubbleSort() {
int[] data = {4, 5, 6, 3, 2, 1};
System.out.println("未排序=" + Arrays.toString(data));
// 从小到大排序
for (int i = 0; i < data.length; i++) {
// 是否有交互数据
boolean swap = false;
for (int j = 0; j < data.length - i - 1; j++) {
if (data[j] > data[j + 1]) {
int t = data[j];
data[j] = data[j + 1];
data[j + 1] = t;
swap = true;
}
}
System.out.println(String.format("第%d轮", i + 1) + "=" + Arrays.toString(data) + ",swap=" + swap);
if (!swap) {
break;
}
}
}
选择排序
选择排序每次会从未排序区间中找到最小的元素,将其放到已排序区间的末尾
public class SelectionSort implements IArraySort {
@Override
public int[] sort(int[] sourceArray) throws Exception {
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
// 总共要经过 N-1 轮比较
for (int i = 0; i < arr.length - 1; i++) {
int min = i;
// 每轮需要比较的次数 N-i
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
// 记录目前能找到的最小值元素的下标
min = j;
}
}
// 将找到的最小值和i位置所在的值进行交换
if (i != min) {
int tmp = arr[i];
arr[i] = arr[min];
arr[min] = tmp;
}
}
return arr;
}
}