public class Selection {
public static void sort(Comparable[] a){
int N = a.length;
for(int i=0;i<N;i++){
int min = i;
for(int j=i+1;j<N;j++){
if(less(a[j],a[min])) min=j;
}
exch(a,i,min);
}
}
}
public class Insertion{
public static void sort(Comparable[] a){
int N = a.length;
for(int i=1;i<n;i++){
for(int j=i;j>0&&less(a[j],a[j-1]);j--){
exch(a,j,j-1);
}
}
}
}
3.希尔排序
插入排序的改进,交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序的数组排序
时间复杂度与初始顺序有关
平均时间复杂度
最好时间复杂度
最坏时间复杂度
空间复杂度
稳定性
O(n^1.3)
O(n)
O(n^2)
O(1)
不稳定
public class Shell{
public static void sort(Comparable[] a){
int N = a.length;
int h = 1;
while(h<N/3) h=h*3+1;
while(h>=1){
for(int i=h;i<N;i++){
for(int j=i;j>=h&&less(a[j],a[j-h]);j-=h){
exch(a,j,j-h);
}
}
h/=3;
}
}
}
public class Bubble{
public static void sort(Comparable[] a){
int N = a.length;
boolean flag = false;
for(int i=0;i<N;i++){
for(int j=0;j<N-1-i;j++){
if(less(a[j+1],a[j])){exch(a,j,j+1);flag=true;}
}
if(!flag) break;
flag = false;
}
}
}
5.归并排序
采用分治法,先使每个子序列有序,再使子序列段间有序
对于一个长度为N的数组,平均情况下归并排序需要进行(nlog2n)/2次比较
时间复杂度与初始排序无关
平均时间复杂度
最好时间复杂度
最坏时间复杂度
空间复杂度
稳定性
O(nlog2n)
O(nlog2n)
O(nlog2n)
O(n)
稳定
public class Merge{
private static Comparable[] aux;
public static void sort(Comparable[] a){
aux = new Comparable[a.length];
sort(a,0,a.length-1);
}
private static void sort(Comparable[] a,int lo,int hi){
if(lo>=hi) return;
int mid = (lo+hi)/2;
sort(a,lo,mid);
sort(a,mid+1,hi);
merge(a,lo,mid,hi);
}
private static void merge(Comparable[] a,int lo,int mid,int hi){
for(int i=lo;i<=hi;i++){aux[i]=a[i];}
int i,j,k;
for(k=lo,i=lo,j=mid+1;i<=mid&&j<=hi;){
if(lessOrEqual(aux[i],aux[j])) a[k++]=aux[i++];
else a[k++]=aux[j++];
}
while(i<=mid){a[k++]=aux[i++];}
while(j<=hi){a[k++]=aux[j++];}
}
private static boolean lessOrEqual(Comparable v,Comparable w){return v.compareTo(w)<=0;}
}
6.快速排序
采用分治法,将一个数组分成两个子数组,将两部分独立地排序,重复上述步骤
对于一个长度为N的数组,平均情况下快速排序需要进行nlog2n次比较
时间复杂度与初始排序有关
平均时间复杂度
最好时间复杂度
最坏时间复杂度
最好空间复杂度
最坏空间复杂度
稳定性
O(nlog2n)
O(nlog2n)
O(n^2)
O(log2n)
O(n)
不稳定
public class Quick{
public static void sort(Comparable[] a,int lo,int hi){
if(lo>=hi) return;
int j = partition(a,lo,hi);
sort(a,lo,j-1);
sort(a,j+1,hi);
}
private static int partition(Comparable[] a,int lo,int hi){
int i=lo,j=hi+1;
Comparable stan = a[lo];
while(true){
while(less(a[++i],stan)) if(i>=hi) break;
while(less(stan,a[--j])) if(j<=lo) break;
if(i>=j) break;
exch(a,i,j);
}
exch(a,j,lo);
return j;
}
private static boolean less(Comparable v,Comparable w){return v.compareTo(w)<0;}
private static void exch(Comparable[] a,int i,int j){Comparable temp=a[i];a[i]=a[j];a[j]=temp;}
}