插入排序
直接插入排序
基本思想
插入排序是指在待排序的元素中,假设前面n-1(其中n>=2)个数已经是排好顺序的,现将第n个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。
排序过程
算法实现
/**
* 直接插入排序
* @param arr
* @return
*/
public int[] insertionSort(int[] arr) {
//0---i-1为有序序列,i---N为无序序列(N>=2)
for (int i = 1; i < arr.length; i++) {
//对 arr[i] 进行插入排序
int key = arr[i];
int j = i;
//找到arr[i]的正确为,并将比arr[i]大的元素向后移到
for (; j > 0 && arr[j - 1] > key;j--) {
arr[j] = arr[j - 1];
}
//将arr[i] 放到对应位置
arr[j] = key;
}
return arr;
}
@Test
public void TestInsertionSort() {
int[] arr = new int[]{2,4,5,6,1,3};
for (int i : insertionSort(arr)) {
System.out.println(i);
}
}
算法分析
时间效率 | O(n^2) |
空间效率 | O(1) |
稳定性 | 稳定 |
二分插入排序
由于直接插入排序的基本操作是在一个有序表中进行查找和插入的,二在有序表中的查找操作是可以利用二分查找来实现的,由此进行的插入排序称为二分插入排序。
算法实现
/**
* 二分插入排序
* @return
*/
public int[] BinaryInsertionSort(int[] arr){
for(int i= 1,len = arr.length;i<len;i++){
int key = arr[i];//先将待排序位置的值记录下来
int start=0;
int end=i-1;//有序序列的最后一个元素的下标
while (start <= end){
int mid = (end+start)/2;//取中点
if(arr[mid] > key){
end = mid-1;//取左区间
}else {
start = mid + 1;//取右区间
}
}
//元素后移空出插入位置
for(int k = i-1;k>=end+1;k--){
arr[k+1] = arr[k];
}
//插入记录
arr[end+1] = key;
}
return arr;
}
@Test
public void TestInsertionSort() {
int[] arr = new int[]{2, 4, 5, 6, 1, 3};
for (int i : BinaryInsertionSort(arr)) {
System.out.print(i+" ");
}
}
//排序结果
//1 2 3 4 5 6
算法分析
时间效率 | O(n^2) |
空间效率 | O(1) |
稳定性 | 稳定 |