直接插入排序算法对于序列长度较小或者序列长度大但是基本有序的序列排序效率较高,但是序列长且无序,建议使用希尔排序算法
package sort;
//插入排序算法
public class InsertSort {
public static void main(String args[]){
int a[] ={0,9,5,6,10,2,7,8};
directInsertSort(a);
}
//打印当前数组的内容
public static void printArray(String text,int []a){
System.out.print(text);
int n = a.length;
//遍历数组当中的内容
for(int i=0;i<n-1;i++){
System.out.print(a[i]+",");
}
System.out.println(a[n-1]);
}
//直接插入排序(从小排到大)
/*排序思想:
* 用数组a[0]作为标记位,实际排序序列为{9,5,6,10,2,7,8}
* 将a[1]作为第一个有序序列,从a[2]开始排序
* 对比有序序列的最后一位a[i-1]和a[i]的大小,如果大于则将a[i]放入标记位,进行排序;如果小于等于,则是有序的,不需要排序
* 有序序列当中从后开始查找插入标记位a[0]的位置,如果不是标记位置,将数据后移一位;如果是,则插入数据
*/
public static int[] directInsertSort(int []a){
printArray("当前的数组为:", a);
//计算输入数组a的长度
int n = a.length;
//从a[2]开始排序
for(int i=2;i<n;i++){
//如果后一位比前一位小,就记入标记位进行排序;后一位比前一位大,则是有序的,不需要排序
if(a[i]<a[i-1]){
a[0] = a[i];
printArray("将第"+i+"位放入标记位:",a);
//排序,查找插入的位置
int j;
//因为a[i]已经放入了标记位,所以从i-1位开始从后向前移动数据
for(j=i-1;a[0]< a[j];j--){
//使前一位的数据等于后一位的数据,相当于后移了一位
a[j+1] = a[j];
}
//当a[0]>a[j]时跳出循环,这时数组当中的情况为 a[j] a[j+1] a[j+1](j+1位已经后移了一位了),
//所以只要将a[j+1] = a[0]即可
a[j+1] = a[0];
printArray("从后开始移动数据,找到插入数据位置为"+(j+1)+":",a);
}
}
return a;
}
}
注释当中过程已经说的很清楚了,直接看输出结果: