桶排序
不是基于比较的排序
时间复杂度 O(N)
1、计数排序
员工按照身高排序
100-300建立桶
将员工按照身高放入桶中,依次倒出员工,便是以按身高排好序
2、基数排序
eg:23 14 101 72 84 11
步骤:
1)将数字位数统一
023 014 101 072 084 011
2)建立0-9 10个桶
按个位数比较,进入相应的桶
0
1:101、011
2:072
3:023
4:014、 084
5
6
7
8
9
3)依次倒出每个桶中元素
101 011 072 023 014 084
4)根据十位数进入相应的桶
0 :101
1:011、014
2:023
3
4:
5
6
7:072
8:084
9
5)依次倒出每个桶中元素
101 011 014 023 072 084
6)根据百位数进入相应的桶
0:011 014 023 072 084
1:101
7)最后倒出序列则是有序序列
011 014 023 072 084 101
public static void radixSort(int[] a)
{
int max = Integer.MIN_VALUE;
for(int i=0;i<a.length;i++)
{
if(a[i]>max)
{
max=a[i];
}
}
int maxLength=(max+"".length());
//用于存储临时数据的数组
int [][] temp=new int[a.length][a.length];
//用于记录在temp中相应数组中存放数字的数量
int[] counts=new int[10];
for(int i=0,n=1;i<maxLength;i++,n*=10)
{
//每个数字分别计算余数
for(int j=0;j<a.length;j++)
{
int ys=a[j]/n%10;
temp[ys][counts[ys]]=a[j];
counts[ys]++;
}
int index=0;
for(int k=0;k<counts.length;k++)
{
if(counts[k]!=0)
{
for(int l=0;l<counts[k];l++)
{
a[index]=temp[k][l];
index++;
}
counts[k]=0;
}
}
}
}
--------------------------------------------------------------------------------------------------------------------
排序算法空间复杂度总结:
O(1):插入排序、选择排序、冒泡排序、堆排序、希尔排序
O(logN)- O(N):快速排序
O(N):归并排序
O(M):基数排序、基数排序
------------------------------------------------------------------------------------------------------------
算法稳定性:
稳定排序:冒泡排序、插入排序、归并排序、计数排序、基数排序、桶排序
不稳定排序:选择排序、快速排序、希尔排序、桶排序
选择排序不稳定举例:
2(1) 2(2) 2(3) 1
1 2(2) 2(3) 2(1)
快速排序不稳定例子:
4 3(1) 3(2) 3(3) 5 3(2)划分值
3(1) 3(3) 3(2) 4 5
希尔排序不稳定
5 1(1) 1(2) 5 步长为2
1(2) 1(1) 5 5