一,冒泡排序
算法思路
冒泡排序的原理可以顧名思義:把每個資料看成一個氣泡,按初始順序自底向上依次對兩兩氣泡進行比較,對上重下輕的氣泡交換順序(這裡用氣泡輕、重表示資料大、小),保證輕的氣泡總能浮在重的氣泡上面,直到最輕的氣泡浮到最上面;保持最後浮出的氣泡不變,對餘下氣泡循環上述步驟,直到所有氣泡從輕到重排列完畢。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYWan5CO4kDN5UTMzUGZmR2N0MTZyYzX5EzNzATM5IzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.gif)
算法分析
- 穩定排序
- 時間複雜度;亂序:O(N^2),有序:O(N)
- 空間複雜度:O(1)
算法實作
public class BubbleSort {
/**
* 冒泡排序 --- O(N^2)
* 有序數組 --- O(N)
* @param a
*/
public static void bubleSort(int[] a){
int tmp;
//第一層循環是比較的輪數
for(int i = 0;i<a.length-1;i++){
//第二層循環是每一輪比較的次數
for(int j = 0;j<a.length-i-1;j++){
//交換
if(a[j] > a[j+1]){
tmp = a[j];
a[j] = a[j+1];
a[j+1] = tmp;
}
}
}
}
public static void main(String[] args){
int[] a = {1,8,2,6,4,2,3,8,4,6,10,12,45,21,31,22,22,22,23,21,20,23,24,21,23,23};
bubleSort(a);
for(int i = 0;i<a.length;i++) {
System.out.print(a[i]+"\t");
}
}
}
二,基數排序
算法思路
- 最低位優先法,簡稱LSD法:先從最低位開始排序,再對次低位排序,直到對最高位排序後得到一個有序序列;
- 最高位優先法,簡稱MSD法:先從最高位開始排序,再逐個對各分組按次高位進行子排序,循環直到最低位。
算法分析
- 基數排序是穩定排序,在某些時候,基數排序法的效率高于其它的穩定性排序法。
- 時間複雜度:O(N)
- 空間複雜度:O(N)
算法實作
public class RadixSort {
/**
* 擷取待排序數組中的最大值
* @param array
* @return
*/
private static int getMax(int[] array){
int max = array[0];
for(int i = 1;i<array.length;i++) {
if (array[i] > max) {
max = array[i];
}
}
return max;
}
/**
* 基數排序實作
* @param arr
* @param exp
*/
private static void countSort(int arr[], int exp) {
int n = arr.length;
int output[] = new int[n];
int i;
int[] count = new int[10];
count[0] = 0;
for (i = 0; i < n; i++) {
count[(arr[i] / exp) % 10]++;
}
for (i = 1; i < 10; i++) {
count[i] += count[i - 1];
}
for (i = n - 1; i >= 0; i--) {
output[count[ (arr[i]/exp)%10 ] - 1] = arr[i];
count[ (arr[i]/exp)%10 ]--;
}
for (i = 0; i < n; i++) {
arr[i] = output[i];
}
}
/**
* 基數排序 --- 時間複雜度O(N)
* @param arr
*/
public static void radixsort(int arr[]) {
int n = arr.length;
int m = getMax(arr);
for (int exp = 1; m/exp > 0; exp *= 10) {
countSort(arr,exp);
}
}
public static void main(String[] args){
int[] a = {1,8,2,6,4,2,3,8,4,6,10,12,45,21,31,22,22,22,23,21,20,23,24,21,23,23};
radixsort(a);
for(int i = 0;i<a.length;i++) {
System.out.print(a[i]+"\t");
}
}
}