直接插入排序
已知一组,一组无序数据b[1]、b[2]、……b[m],需将其变成一个升序数列。先创建一个变量a。首先将不b[1]与b[2],如果b[1]大于b[2]则交换位置,否则不变;再比较b[2]与b[3],如果b[3]小于b[2],则将b[3]赋值给a,再将a与b[1]比较,如果a小于b[1];则将b[2],b[1]依次后移;在将a放在b[1]处以此类推,直到排序结束。
public class insertSort {
public static void main(String[] args)
{
int maxSize=100;
ArrayIns arr;
arr=new ArrayIns(maxSize);
arr.insert(77);
arr.insert(99);
arr.insert(44);
arr.insert(55);
arr.insert(22);
arr.insert(88);
arr.insert(11);
arr.insert(00);
arr.insert(66);
arr.insert(33);
arr.display();
arr.insertSort();
arr.display();
}
}
class ArrayIns
{
private int[] a;
private int nElems;
//构造函数
public ArrayIns(int max)
{
a=newint[max];
nElems=0;
}
//插入数据
public void insert(int value)
{
a[nElems]=value;
nElems++;
}
//显示数组数据
public void display()
{
for(int j=0;j<nElems;j++)
System.out.println(a[j]+" ");
System.out.println(" ");
}
public void insertSort()
{
int out,temp,in;
for(out=1;out<nElems;out++)
{
temp=a[out];
in=out;
while(in>0&&a[in-1]>=temp)//寻找插入位置
{
a[in]=a[in-1];
in--;
}
a[in]=temp;
}
}
}
原数组: 77 99 44 55 22 88 11 0 66 33
插入第一趟:77 99 44 55 22 88 11 0 66 33 比较1次
插入第二趟:44 77 99 55 22 88 11 0 66 33 比较2次
插入第三趟:44 55 77 99 22 88 11 0 66 33 比较3次
插入第四趟:22 44 55 77 99 88 11 0 66 33 比较4次
插入第五趟:22 44 55 77 88 99 11 0 66 33 比较5次
插入第六趟:11 22 44 55 77 88 99 0 66 33 比较6次
插入第七趟:0 11 22 44 55 77 88 99 66 33 比较7次
插入第八趟:0 11 22 33 44 55 77 88 99 66 比较8次
插入第九趟:0 11 22 33 44 55 66 77 88 99 比较9次
插入排序效率分析:
比较的次数:
1+2+3+4+5+6+7+8+9=45;
当数组的元素为N时,比较的次数为:N*(N-1)/2;
所以比较的次数为:o(N*N);
当数组全部有序的时候,将一个数插入到有序数组中时,需要比较N-1次。
所以比较的次数为:o(N);