排序算法1.插入排序
插入排序的核心思想:
参考笔记:
http://blog.youkuaiyun.com/han_xiaoyang/article/details/12163251
建议大家在看了笔记的核心思想后,自己在纸上画一下,大概的内部排序过程。
看完楼上连接的笔记有感:
插入排序就是在已排序的数组内,插入一个元素。
核心操作:不断的从已排序的数组末尾比较,找到新元素的位置插入(构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入)
已排序的数组:数组内的元素从a[0] …. 不短递增。当以排数组a.length = 数组总长度时,我们的插入排序就结束了。
以下是我写的简单的java demo。
编码思路:
int array[] = {4,3,1,2};
第1次
array[0] 为一个已排序的数组【数组len =1】插入元素a[1]。比较 a[1] , a[0] ,如果 a[1] < a[0] ,开始位置交换。数组{3,4,1,2} 第一次插入结束。第2次
array[0,1] 为一个已排序的数组【数组长度 =2】,插入元素a[2]。 先比较a[2],a[1], 如果a[2] < a[1] ,位置交换 数组{3,1,4,2} 接续比较a[1],a[0],位置交换 数组{1,3,4,2}.第i次
array[0,….a[i-1]] 为一个以排序的数组【数组长度 =i】,插入元素a[i]。先比较a[i],a[i-1],如果a[i] < a[i-1] ,位置交换。比较a[i-1],a[i-2]直到新插入的元素a[i]的值不小于前面的值,插入完成。
写到这里,我可以得出以下结论(demo为升序排列,降序排列以此类推):
1.如果要实现位置交换,i 从1 开始需要满足 a[i] < a[i -1] ;
2.第i次插入,最多比较 i 次。
public class ArrayInsertSort {
public static void main(String[] args) {
int array[] = {4,3,1,2};
for(int i = 1 ; i < array.length;i++){
//循环,获取即将插入的元素a[i];
if(array[i]<array[i-1]){
//比较 a[i]与以排序数组末尾 a[i-1] 的值
for(int j = i ; j>0 ; j--){
int temp = array[j];
if(array[j]<array[j-1]){
System.out.println("外层第"+i+"次比较数组交换位置 :" +array[j] +"<-->" + array[j-1]);
array[j] = array[j-1];
array[j-1] = temp;
}else{
break;
}
}
}
}
System.out.println("快速排序之后的结果");
for(int i:array){
System.out.println(i);
}
}
}