插入排序的基本思想:逐个考察待排序队列中的每个元素,将元素插入到前面已经排好序队列的适当位置,使得到的新队列任然有序。
插入排序方法:直接插入排序、折半插入排序、shell排序。
1.直接插入排序
排序原理:对一个元素的序列总是有序的,对N序列来说,从第二个元素开始到第N个元素,逐个向有序队列中添加元素(插入操作).从而使N序列有序。对j-1个元素的有序序列插入一个元素的方法:(假设升序排列)从j-1开始往前找,如果当前元素比要插入的元素大(temp<arr[k]),则将当前元素后移,直到找到插入位置(temp>arr[k]).在插入元素。
public static void insertSort(int[] arr){
int len = arr.length;
//i=0 只有一个元素,认为是有序队列,所以从i=1开始.
for(int i=1;i<len;i++){
//小于时需要将r[i] 插入到有序队列中
if(arr[i]<arr[i-1]){
int temp = arr[i];//取出当前值
arr[i] = arr[i-1];//队列后移
int j = i-2; //temp 要和有序队列中的前i-1个(0到i-2)元素比较.(arr[i-1]已经比较过了)
//比较并后移.
for(;j>=0&&arr[j]>temp;j--){
arr[j+1] = arr[j];
}
arr[j+1] = temp;//插入正确位置.
}
}
}
2.折半插入排序
排序原理:通过折半查找的方式在有序序列中确定元素要插入的位置,其他和直接插入一样。
public static void biinsertSort(int[] arr){
int len = arr.length;
for(int i=0;i<len;i++){
//二分查找的方式查找元素要插入的位置
int low = 0;
int hight = i-1;
int temp = arr[i]; //取出要插入元素的值,否则元素后移覆盖.
while(low<=hight){
int mid = (low+hight)/2;
if(arr[i]<arr[mid]){
hight = mid-1;
}else{
low = mid+1;
}
}
//在hight到i-1位置的元素往后移动.
for(int j = i-1;j>hight;j--){
arr[j+1] = arr[j];
}
arr[hight+1] = temp;//插入元素
}}
3.shell排序
有空研究一下