插入排序
插入排序,一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法 。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动 。
1:直接插入排序
直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。
插入排序-直接插入排序:
- 时间复杂度:
- 最坏情况下 O ( N 2 ) O(N^2) O(N2)
- 最好情况下 O ( N ) O(N) O(N) (数据量不大,基本有序,则选择直接插入排序)
- 空间复杂度: O ( 1 ) O(1) O(1)
- 稳定性:稳定
public class 直接插入排序 {
public static void main(String[] args) {
int [] array=new int[]{2,4,5,3,6,1};
func(array);
System.out.println(Arrays.toString(array));
}
//从小到大排序
private static void func(int [] array){
int temp;
int j;
for(int i=1;i<array.length;i++){
temp=array[i];
j=i-1;
for(;j>=0;j--){
if(array[j]>temp){
array[j+1]=array[j];
}else {
break;
}
}
array[j+1]=temp;
}
}
}
2:希尔排序
希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。
缩小增量排序:
分组的思想,增量最好为素数,且最后一组增量为1。
插入排序-希尔排序:
- 时间复杂度: 和gap分组有关(增量有关)
- 空间复杂度: O ( 1 ) O(1) O(1)
- 稳定性:不稳定
public class 希尔排序 {
public static void main(String[] args) {
int [] array=new int[]{4,2,6,7,8,1,22,11,44,24,13};
func(array);
System.out.println(Arrays.toString(array));
}
private static void func(int [] array){
int gap=array.length;
while (gap>1){
gap=gap/2;
if(gap==1){
shell(array,gap);
break;
}else {
shell(array, gap);
}
}
}
//从小到大
private static void shell(int [] array , int gap){
int temp;
int j;
for(int i=gap;i<array.length;i++){
temp=array[i];
j=i-gap;
for(;j>=0;j-=gap){
if(array[j]>temp){
array[j+gap]=array[j];
}else {
break;
}
}
array[j+gap]=temp;
}
}
}