對數組中的數據進行排序,主要有以下四種方法:
- 冒泡排序
- 直接插入排序
- 選擇排序
- Shell排序
(一)冒泡排序法:
- 時間複雜度:O(n^2)
- 空間複雜度:O(1)
- 穩定性:穩定
冒泡排序法的核心思想是將大的數據看作大的氣泡,小的數據看作小的氣泡,大的氣泡降下去,小的氣泡升上來。如圖:
如圖,對數組中元素進行第一次排序,使1浮上來,將8沉了下去。
代碼示例:
public static void main(String[] args) {
int[] array={2,5,8,3,1,6,7,4,9};
for (int i = 0; i <array.length-1 ; i++) {
for (int j = 0; j <array.length-1-i ; j++) {
if(array[j]>array[j+1]) {
int tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
}
}
System.out.println(Arrays.toString(array));
}
}
(二)直接插入排序
- 越有序越快
- 時間複雜度:
無序:o(n^2)
有序:o(n) - 空間複雜度:o(1)
- 穩定性:穩定 沒有出現跳躍式的交換
直接插入排序核心思想是將第i個數字上拿出來給tmp,將j(i-1)上的數字與tmp比較,滿足(array[j]>tmp)時將array[j]上的數字賦給array[j+1] 然後j-1,再次判斷(array[j]>tmp),如果滿足,則將array[j]上的數字賦給array[j+1],否則將tmp的值賦給array[j+1] ,如此i++,判斷所有數字;如圖:
public static void insertSort(int[] array){
int tmp;
for (int i = 1; i <array.length ; i++) {
tmp=array[i];
int j=0;
for ( j = i-1; j >=0 ; j--) {
if(array[j]>tmp){
array[j+1]=array[j];
}else{
break;
}
}
array[j+1]=tmp;
}
}
(三)選擇排序
- 時間複雜度:o(n^2)
- 空間複雜度:o(1)
- 穩定性:不穩定
選擇排序與冒泡排序比較相似,所以在我們不熟悉冒泡排序的時候容易將冒泡排序寫成選擇排序,選擇排序的基本思想如圖:
代碼示例:
public static void selectSort(int[] array){
int tmp=0;
for (int i = 0; i <array.length ; i++) {
for (int j = i+1; j <array.length ; j++) {
if(array[i]>array[j]){
tmp=array[j];
array[j]=array[i];
array[i]=tmp;
}
}
}
System.out.println(Arrays.toString(array));
}
(四)shell排序
- 時間複雜度:O(n^1.3 – ^1.5)
- 空間複雜度:O(1)
- 穩定性:不穩定
特點:
- 快速
- 增量序列: 總爲質數 即除了它本身和1沒有其他因子
shell排序的思想是先分組,進行組內插入排序。如圖:
代碼示例:
public class shellSort {
public static void shell(int[] array, int gap) {
int tmp = 0;
for (int i = gap; i < array.length; i++) {
tmp = array[i];
int j = 0;
for (j = i - gap; j >= 0; j -= gap) {
if (array[j] > tmp) {
array[j + gap] = array[j];
} else {
break;
}
}
array[j + gap] = tmp;
}
}
public static void shellSort(int[] array) {
int drr[] = {5, 3, 1}; //增量序列
for (int i = 0; i < drr.length; i++) {
shell(array, drr[i]);
}
}
public static void main(String[] args) {
int[] array = {12, 7, 2, 8, 15, 67, 94, 34, 16, 13, 31, 27, 65, 82, 21};
shellSort(array);
System.out.println(Arrays.toString(array));
}
}