有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法
将n个元素的数列分为已有序和无序两个部分,如
下所示:
{{a1},{a2,a3,a4,…,an}}
{{a1⑴,a2⑴},{a3⑴,a4⑴ …,an⑴}}
…
{{a1(n-1),a2(n-1) ,…},{an(n-1)}}
每次处理就是将无序数列的第一个元素与有序数列的元素从后往前逐个进行比较,找出插入位置,将该元素插入到有序数列的合适位置中。
算法步骤
⒈从有序数列和无序数列{a2,a3,…,an}开始进行排序;
⒉处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无序的。用ai与ai-1,a i-2,…,a1进行比较,找出合适的位置将ai插入;
⒊重复第二步,共进行n-i次插入处理,数列全部有序。
package cn.hncu;
public class insertSort {
public static void main(String[] args) {
int[] a = new int[1000];
for(int i=0;i<a.length;i++){
a[i] = (int)(Math.random()*a.length);
}
long startTime = System.currentTimeMillis();//返回以毫秒为单位的当前时间。
//1 插入排序
//insertSort(a);
//1.1 结合二分法的插入排序
insertSort2(a);
print(a);
long endTime = System.currentTimeMillis();//返回以毫秒为单位的当前时间。
System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
}
private static void insertSort(int[] a) {
for(int i=0;i<a.length-1;i++){
int temp=a[i+1];
int j=i;
while(a[j]>temp){
a[j+1]=a[j];
j--;
if(j<0){
break;
}
}
a[j+1]=temp;
}
}
private static void insertSort2(int[] a) {
for(int i=0;i<a.length-1;i++){
int temp=a[i+1];
int low = 0;
int high = i;
int mid;
//在low与high之间的区域进行二分查找:
//找到新插入元素的位置
while(low<=high){
mid=(low+high)/2;
if(a[mid]>temp){
high=mid-1;
}else{
low=mid+1;
}
}
//经过上面的二分查找,得到新元素的位置是:high+1
//把[high+1,i]区间内的所有元素往后移一个位置
for(int j=i;j>high;j--){
a[j+1]=a[j];
}
a[high+1]=temp;
}
}
private static void print(int[] a) {
for(int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
}
}