SelectionSort
在 i
到 n - 1
范围上,找到最小值并放到 i
位置上,然后在 i + 1
到 n - 1
范围上继续. 也就是说从头到尾遍历,找到最小的放到第一位,然后从第二位开始遍历到最后,还是找到最小的,放到第二个位置,依次类推。
public static void sort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
SortUtils.swap(arr, i, minIndex);
}
}
BubbleSort
在 0 ~ i
位置上,相邻位置较大的数往后移,最大值最终来到 i
位置,然后 0 ~ i - 1
位置继续。
Sort.java
public static void sort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int end = arr.length - 1; end > 0; end--) {
for (int j = 0; j < end; j++) {
if (arr[j + 1] < arr[j]) {
SortUtils.swap(arr, j, j + 1);
}
}
}
}
InsertionSort
0 ~ i
范围上已经有序,新来的数从右往左滑到不再小的位置插入,然后继续。就像打牌一样,比如左手拿着五张牌,是顺子,然后右手又摸了一张牌,这时就需要把新摸的牌放到正确的位置。
public static void sort(int[] arr) {
if (arr == null || arr.length < 2) {
return;
}
for (int i = 1; i < arr.length; i++) {
for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
SortUtils.swap(arr, j, j + 1);
}
}
}
这里边的 j + 1
始终指向新来的数,新来的数跑到那,j + 1
就跟到哪,j
永远是新来数前一个位置。
Test Code
App.java
public static void main(String[] args) {
int[] arr = {3, 1, 2, 4, 7, 6};
sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
1
2
3
4
6
7