插入排序(Java)
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法,算法。插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。
- 时间复杂度:O(n2), 适用于少量数据的排序
- 算法稳定性:稳定性
- 实质:按关键码值的大小插入到前面已经排序的文件中适当位置上,直到全部插入完为止。
图示
(图片来自:https://www.cnblogs.com/guoyaohua/p/8600214.html)
代码如下
public class Insertionsort {
public static void main(String[] args) {
int arr[]= {3,2,5,-1,-2,23,15};
insrertionsort(arr);
System.out.print("插入排序后结果为:");
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
}
private static int [] insrertionsort(int[] arr) {
if(arr.length==0) {
return arr;
}
int current;
for(int i=0;i<arr.length-1;i++) {
current=arr[i+1];
int index=i;
while(index>=0&¤t<arr[index]) {
arr[index+1]=arr[index];
index--;
}
arr[index+1]=current;
}
return arr;
}
}
运行结果
插入排序后结果为:-2 -1 2 3 5 15 23
折半插入排序
折半插入排序采用折半查找,查找效率提高。但元素
移动次数不变,仅仅将分散移动改为集合移动。
折半插入算法图示
代码如下
public class Halfinsertionsort {
public static void main(String[] args) {
int []arr= {2,5,-1,-2,12,34,25};
halfinsertionsort(arr);
System.out.print("折半插入排序的结果为:");
for(int i=0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
}
private static int [] halfinsertionsort(int[] arr) {
int i,j;
for(i=0;i<arr.length;i++) {
int temp=arr[i];
int low=0;
int high=i-1;
while(low<=high) {//二分查找法
int mid=(low+high)/2;
if(arr[mid]>temp) {
high=mid-1;
}else {
low=mid+1;
}
}
for(j=i-1;j>=low;j--) {
arr[j+1]=arr[j];//元素后移
}
arr[low]=temp;//插入temp
}
return arr;
}
}
运行结果
折半插入排序的结果为:-2 -1 2 5 12 25 34