1.选择排序
package Sort;
/*
选择排序
描述:不断选择剩余元素中的最小者
*/
public class Selection {
public static void sort(Integer[] a){
//将a[]按升序
int N=a.length;
for(int i=0;i<N;i++){
int min=i;
for(int j=i+1;j<N;j++){
if(a[j]<a[min]){
min=j;
}
}
//将a[i]和a[i+1..N]中最小的元素交换
int temp=a[i];
a[i]=a[min];
a[min]=temp;
}
}
}
2.插入排序
package Sort;
/*
插入排序
描述:对于1到N-1之间的每个i,将a[i]与a[0]到a[i-1]中比它小的所有元素依次有序的交换
在索引i由左向右的变化中,它左侧的元素总是有序的,所以当i到达数组的右端时排序就完成了
时间复杂度:O(n^2)
*/
public class Insertion {
public static void sort(Integer[] a){
int N=a.length;
//将a[]按升序排序
for(int i=1;i<N;i++){
//将a[i]插入到a[i-1...]之中
for(int j=i;j>0&&(a[j]<a[j-1]);j--){
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
}
3.希尔排序
package Sort;
/*
希尔排序
描述:使数组中任意间隔为h的元素都是有序的
*/
public class Shell {
public static void sort(Integer[] a){
//将a[]按升序
int N=a.length;
int h=1;
while(h<N/3)
h=3*h+1;
while(h>=1){
//将数组变为h有序
for(int i=h;i<N;i++){
for(int j=i;j>=h&&(a[j]<a[j-h]);j-=h){
int temp=a[j];
a[j]=a[j-h];
a[j-h]=temp;
}
}
}
}
}
4.归并排序
package Sort;
import java.util.Arrays;
/*
自顶向下的归并排序
*/
public class Merge {
private static Integer[] aux;//归并需要的辅助数组
public static void sort(Integer[] a){
aux=new Integer[a.length];
sort(a,0,a.length-1);
}
private static void sort(Integer[] a,int lo,int hi){
if(hi<=lo)
return;
int mid=lo+(hi-lo)/2;
sort(a,lo,mid);//左边排序
sort(a,mid+1,hi);//右边排序
merge(a,lo,mid,hi);
}
private static void merge(Integer[] a,int lo,int mid,int hi){
//将a[lo..mid],a[mid+1..hi]归并
int i=lo,j=mid+1;
for(int k=lo;k<=hi;k++)
aux[k]=a[k];//将a复制到aux
for(int k=lo;k<=hi;k++){
if(i>mid)
a[k]=aux[j++];
else if(j>hi)
a[k]=aux[i++];
else if(aux[j]<aux[i])
a[k]=aux[j++];
else
a[k]=aux[i++];
}
}
//测试
public static void main(String[] args) {
Integer[] a={3,6,1,8,2};
Merge.sort(a);
System.out.println(Arrays.toString(a));
}
}
5.快速排序
快速排序的平均时间复杂度是 O(nlogn),最坏情况下的时间复杂度是 O(n^2)。
package Sort;
import java.util.Arrays;
/*
快速排序
*/
public class Quick {
public static void sort(Integer[] a){
sort(a,0,a.length-1);
}
public static void sort(Integer[]a,int lo,int hi){
if(hi<=lo)
return;
int j=partition(a,lo,hi);
sort(a,lo,j-1);//将左半部分排序
sort(a,j+1,hi);//将右半部分排序
}
//切分
public static int partition(Integer[] a,int lo,int hi){
int i=lo,j=hi+1;//左右扫描指针
Integer v=a[lo];//切分元素
while(true){
while(a[++i]<v)
if(i==hi)
break;
while(v<a[--j])
if(j==lo)
break;
if(i>=j)
break;
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
int temp=a[lo];
a[lo]=a[j];
a[j]=temp;
return j;
}
//测试
public static void main(String[] args) {
Integer[] a={3,6,1,8,2};
Merge.sort(a);
System.out.println(Arrays.toString(a));
}
}