algo/java/11_sorts/Sorts.java
2019-05-08 23:32:11 +08:00

107 lines
3.1 KiB
Java
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package sorts;
import java.util.Arrays;
/**
* 冒泡排序、插入排序、选择排序
* <p>
* Author: Zheng
*/
public class Sorts {
// 冒泡排序a是数组n表示数组大小
public static void bubbleSort(int[] a, int n) {
if (n <= 1) return;
for (int i = 0; i < n; ++i) {
// 提前退出标志位
boolean flag = false;
for (int j = 0; j < n - i - 1; ++j) {
if (a[j] > a[j + 1]) { // 交换
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
// 此次冒泡有数据交换
flag = true;
}
}
if (!flag) break; // 没有数据交换,提前退出
}
}
/**
* 冒泡排序改进:在每一轮排序后记录最后一次元素交换的位置,作为下次比较的边界,
* 对于边界外的元素在下次循环中无需比较.
*/
public static void bubbleSort2(int[] a, int n) {
if (n <= 1) return;
// 最后一次交换的位置
int lastExchange = 0;
// 无序数据的边界,每次只需要比较到这里即可退出
int sortBorder = n - 1;
for (int i = 0; i < n; i++) {
// 提前退出标志位
boolean flag = false;
for (int j = 0; j < sortBorder; j++) {
if (a[j] > a[j + 1]) {
int tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
// 此次冒泡有数据交换
flag = true;
// 更新最后一次交换的位置
lastExchange = j;
}
}
sortBorder = lastExchange;
if (!flag) break; // 没有数据交换,提前退出
}
}
// 插入排序a表示数组n表示数组大小
public static void insertionSort(int[] a, int n) {
if (n <= 1) return;
for (int i = 1; i < n; ++i) {
int value = a[i];
int j = i - 1;
// 查找要插入的位置并移动数据
for (; j >= 0; --j) {
if (a[j] > value) {
a[j + 1] = a[j];
} else {
break;
}
}
a[j + 1] = value;
}
}
// 选择排序a表示数组n表示数组大小
public static void selectionSort(int[] a, int n) {
if (n <= 1) return;
for (int i = 0; i < n - 1; ++i) {
// 查找最小值
int minIndex = i;
for (int j = i + 1; j < n; ++j) {
if (a[j] < a[minIndex]) {
minIndex = j;
}
}
// 交换
int tmp = a[i];
a[i] = a[minIndex];
a[minIndex] = tmp;
}
}
public static void main(String[] args) {
int[] array = new int[]{3, 4, 2, 1, 5, 6, 7, 8};
bubbleSort2(array, array.length);
System.out.println(Arrays.toString(array));
}
}