冒泡排序只會操做相鄰的兩個數據。兩兩比較,將較大的數換到後邊。算法
代碼以下:數組
/**
* 冒泡排序
* 兩兩比較,將較大的數移到後邊。
*
* @param a
* @param n
*/
public void bubbleSort(int[] a, int n) {
if (n <= 1) return;
for (int i = 0; i < n; i++) {
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;
}
}
}
}
複製代碼
這裏咱們還能夠進行優化,若是某次冒泡以後已經沒有數據能夠交換時,說明已經達到徹底有序,不用再繼續執行後續的冒泡操做。代碼以下:bash
/**
* 優化後的冒泡排序
*
* @param a
* @param n
*/
public void bubbleSortOptimize(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;
}
}
複製代碼
咱們將待排序的數據分爲兩個區間,已排序區間和未排序區間。初始狀態下,已排序區間爲空。優化
插入算法的核心思想是取未排序區間的元素,在已排序區間中找到合適的位置插入,並保證已排序區間數據一直有序。重複這個過程,直到未排序區間中元素爲空,算法結束。ui
代碼以下:spa
/**
* 插入排序
* 將數據插入到有序數組中。
*
* @param a
* @param n
*/
public void insertSort(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;// 插入數據
}
}
複製代碼
跟插入排序相似,選擇排序也區分已排序區間和未排序區間。初始狀態下,已排序區間爲空。 選擇排序的核心是每次會從未排序區間中找到最小的元素,將其放到已排序區間的末尾。code
代碼以下:排序
/**
* 插入排序
* 從未排序區間中找到最小元素,將其放到已排序區間的末尾。
*
* @param a
* @param n
*/
public void selectSort(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;
}
}
// 減小無用的交換。
if (minIndex == i) {
continue;
}
// 交換
int tmp = a[i];
a[i] = a[minIndex];
a[minIndex] = tmp;
}
}
複製代碼