插入排序
直接插入排序基本思想是每一步將一個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素爲止。
private static void insertionSort(int[] array) {
int j;
for (int i = 0; i < array.length; i++) {
int temp = array[i];
j = i;
//循環找到,當前要插入的數據在之前的排序數組中的位置,其實將比當前值大的值都往後移了一位
while (j > 0 && temp < array[j - 1]) {
array[j] = array[j - 1];
j--;
}
//然後將其放到找到的位置上
array[j] = temp;
}
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
選擇排序
選擇排序的思想就是從循環n次,第一次將角標0及其後元素中的最小值放在角標0處,第二次將角標1及其後元素中的最小值放在角標1處,以此類推,直至最後
private static void selectSort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
int min = i;
for (int j = i + 1; j < array.length; j++) {
if (array[j] < array[min]) {
min = j;
}
}
if (i != min) {
int temp = array[i];
array[i] = array[min];
array[min] = temp;
}
}
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
冒泡排序
冒泡排序的思想是比較相鄰的元素,如果第一個比第二個大,就交換他們兩個位置,以前特喜歡冒泡排序,因爲代碼簡單。。。
private static void sbubbleSort(int[] array) {
for (int i = 1; i < array.length; i++) {
for (int j = 0; j < array.length - i; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
}
對於像這三種排序大家可以debug運行,一步步看看是如何交換數據的,就立馬能清楚了
冒泡、選擇、插入排序都需要 O(N2) 時間級別。一般不會選擇冒泡排序,雖然冒泡排序書寫簡單,但是平均性能是沒有選擇排序和插入排序好的。
選擇排序把交換次數降低到最低,但是比較次數還是挺大的。當數據量小,並且交換數據相對於比較數據更加耗時的情況下,可以應用選擇排序。
在大多數情況下,假設數據量比較小或基本有序時,插入排序是三種算法中最好的選擇。