插入排序:所谓插入排序,即是顺序选择未排序的数字,并将其移动已插入已经排好序的数字的相应位置
下面是最初的写法:
public class Insertion {
public static boolean less(Comparable w, Comparable v)//若w<v则返回true
{
return w.compareTo(v) < 0;
}
public static void exch(Comparable[] a,int i, int j)
{
Comparable temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public static void sort(Comparable[] a)//插入排序
{
int len = a.length;//获取数组的长度
int i, j, k;
for(i = 1; i < len; i++)//i为选择第i个数据将之插入已经排序的数据,其前面i-1个数据已经排好序
{
for(j = 0; j < i; j++ )//将要插入的数据插入合适位置,i-1为已经排好序的最大值的索引
{
if(less(a[i],a[j]))//若要插入的数字小于某个排好序的数字,则将其插入该数据的位置,并将已经排好序的数据都后移一位
{
for(k = i - 1; k >= j; k--)
exch(a, k, k + 1);
}
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] a = {"S","O","R","T","E","X","A","M","P","L","E"};
sort(a);
int i;
for(i = 0;i < a.length;i++)
{
System.out.print(a[i] + " ");
}
}
}
不过sort方法中三层循环嵌套效率过于低下,可以更改为要插入的数据与已经排好序的数字从最后开始比较,若比之小,则交换位置,然后在继续与前面一个数据比较即可,这样可以提高效率,不必三层循环。
public static void sort(Comparable[] a)//插入排序
{
int len = a.length;//数组长度
int i, j;
for(i = 1; i < len; i++)
{
for(j = i;j >= 1 && less(a[j], a[j-1]); j--)
{
exch(a, j, j-1 );
}
}
}