排序算法(二)
插入排序
流程
-
外循环:从下标为1的元素开始向后(右)遍历。
-
内循环:从外循环的下标开始,与前(左)一个值相比。
- 若前方值较小,则不变(其实,因为左边已经是有序的了,所以此处可以直接退出内循环。)
- 若前方值较大,则交换,并进一步与更前方的值比较。
特点
-
适合小规模数组和有序程度高的数组。
-
一般作为高级排序算法的中间过程。
-
插入的含义体现在内循环时,将当前值插入到有序部分的合适位置。
代码如下
public class Insertion {
//用于交换数组对应下标的两值
private static void exch(Comparable[] a,int i,int j){
Comparable t=a[i];
a[i]=a[j];
a[j]=t;
}
//用于判断前者是否小于后者,是则返回true
private static boolean less(Comparable v,Comparable w){
return v.compareTo(w)<0;
}
//用于判断数组是否有序(自然序)
private static boolean issort(Comparable[] a){
for(int i=0;i<a.length-1;i++){
if(less(a[i+1],a[i])){
return false;
}
}
return true;
}
//用于对外提供展示方法
public static void show(Comparable[] a){
for(Comparable c:a){
System.out.println(c);
}
}
//用于对外提供排序的主体方法
public static void sort(Comparable[] a){
for(int i=1;i<a.length;i++){
for(int j=i;j>0&&less(a[j],a[j-1]);j--){
exch(a,j,j-1);
}
}
}
public static void main(String[] args) {
Integer[] a={8,7,6,8,2,4,5,2,1};
sort(a);
System.out.println(issort(a));
show(a);
}
}