一,冒泡排序
算法思路
冒泡排序的原理可以顾名思义:把每个数据看成一个气泡,按初始顺序自底向上依次对两两气泡进行比较,对上重下轻的气泡交换顺序(这里用气泡轻、重表示数据大、小),保证轻的气泡总能浮在重的气泡上面,直到最轻的气泡浮到最上面;保持最后浮出的气泡不变,对余下气泡循环上述步骤,直到所有气泡从轻到重排列完毕。
算法分析
- 稳定排序
- 时间复杂度;乱序: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");
}
}
}