1。直接插入排序
package Sort;
/**
* @author wangpei
* @version
*创建时间:2017年3月28日 下午7:30:37
* 插入排序中的直接插入排序
* 思路:对于r[i],其r[1]-r[i-1]位为有序的,r[i]插入到该有序序列中,
* 再依次向下,比较r[i+1]......
*/
//适用于序列基本有序的情况。最好情况比较n-1次,移动(n+2)*(n-1)/2
//最坏情况比较(n+2)*(n-1)/2,移动(n-1)*(n+4)/2
//平均:o(n*n)
public class Zhijiecharu {
public static void main(String[] args) {
int a[]={0,2,5,3,9,10,1};
sort(a);
}
public static void sort(int a[] ){
int j=0;
for(int i=2;i<a.length;i++){
a[0]=a[i];
for(j=i-1;a[0]<a[j];j--){//将其插入前边的i-1位
a[j+1]=a[j];
}
a[j+1]=a[0];
}
for(int i=1;i<a.length;i++){
System.out.println(a[i]);
}
}
}
2。折半插入排序
package Sort;
/**
* @author wangpei
* @version
*创建时间:2017年3月28日 下午7:58:43
* 折半插入
* 思路: 先在第i-1个元素中折半查找出i要插入的位置,然后移位插入。
*/
//稳定排序,时间复杂度:o(n*n)
public class Zhebancharu {
public static void main(String[] args) {
int a[]={0,2,5,3,9,10,1};
sort(a);
}
public static void sort(int a[] ){
for (int i = 2; i < a.length; i++) {
//先查找a[i]在前i-1个元素中要插入的位置
int low=1;
int high=i-1;
a[0]=a[i];
while(low<=high){
int mid=(low+high)/2;
if(a[mid]>a[0]) high=mid-1;
else low=mid+1;
}//最终查找到i的插入位置为low
for(int k=i-1;k>=low;k--){
a[k+1]=a[k];
}
a[low]=a[0];
}
for (int i = 1; i < a.length; i++) {
System.out.println(a[i]+",");
}
}
}