Java排序算法的模板
public class sort {
private static boolean less(int a,int b){//比较大小
return a>b;
}
private static void change(int[] s,int a,int b){//换序
int temp=s[a];
s[a]=s[b];
s[b]=temp;
}
private static void printSort(int[] a){//输出
for (int i : a) {
System.out.println(i);
}
}
private static boolean isSorted(int[] a){//判断是否有序
for(int i=0;i<a.length-1;i++){
if(less(a[i], a[i+1]))
return false;
}
return true;
}
}
下面是主函数的举例
public static void main(String[] args) {
int[] a=new int[10];
Scanner S=new Scanner(System.in);
for (int i=0;i<a.length;i++) {
a[i]=S.nextInt();
}
S.close();
if(isSorted(a))
{
printSort(a);
}
else{
slection(a);
//Insertion(a);
// shell(a);
printSort(a);
}
}
插入排序
左边有序,每一次将j插入在左边中
public static void Insertion(int[] a){
for(int i=1;i<a.length;i++){
int tem=a[i];
for(int j=i-1;j>=0&&less(a[j],tem);j--)
change(a, j, j+1);
}
}
选择排序
每一次选择最小,放在左边
public static void slection(int[] a){
int min1;
for(int i=0;i<a.length;i++){
min1=i;
for(int j=i+1;j<a.length;j++)
if(less(a[min1], a[j]))
min1=j;
change(a, i, min1);
}
}
插入排序和选择排序的比较
排序方法 | 时间复杂度 | 比较次数 | 交换 |
---|---|---|---|
选择 | O(N*2) | (N*2)/2 | N |
插入 | O(N*2) | 平均:(N*2)/4 | (N*2)/4 |
插入排序:
最好比较次数:N-1 最好交换次数:0
最差比较次数:(N2)/2 最差交换次数:(N2)/2
希尔排序
public static void shell(int[] a){
int N=a.length;
int h=1;
while(h<=N)//1,4,13....类似于步长
h*=3+1;
while(h>=1){
for(int i=h;i<N;i++)
{
for(int j=i;j>=h&&less(a[j-h], a[j]);j-=h)
change(a, j-h, j);
}
h/=3;
}
}
希尔排序的思想能够运用到其他的题目上,对于大容量的排序,希尔排序也是较由于插入和选择的。(为了方便举例,本文全部换成了数字举例,当然,你也可以更换数据类型)下图为希尔排序的排序过程。