public class 插入排序 {
/**
*直接插入排序:
*时间复杂度:O(N^2) 逆序情况
*最好情况 :0(N)在有序情况下
*对于直接插入排序来说数据越有序越快 经常用在数据不多且整体数据趋于有序的
*
*空间复杂度:O(1)
*
* 稳定性:稳定的
* 一个稳定的排序可以实现为不稳定的排序
* 但是一个本身就不稳定的排序,是不可以变成稳定的排序
* @param array
*/
public static void insertSort(int[] array){
for (int i = 1; i < array.length; i++) {
int tmp = array[i];
int j = i - 1;
for (; j >= 0; j--) {
if(tmp < array[j]){
array[j+1] = array[j];
}else{
break;
}
}
array[j+1] = tmp;
}
}
public static void shell(int[] array, int gap){
for (int i = gap; i < array.length; i++) {
int tmp = array[i];
int j = i - gap;
for (; j >= 0; j -= gap) {
if(tmp < array[j]){
array[j+gap] = array[j];
}else{
break;
}
}
array[j+gap] = tmp;
}
}
/**
* 希尔排序:
* 时间复杂度:O(n^1.3 - n^1.5)
*
* 空间复杂度:O(1)
*
* 稳定性:不稳定
* 在比较过程中如果发生了跳跃式的交换那么就是不稳定的排序
* @param array
*/
public static void shellSort(int[] array){
int gap =array.length;
while(gap > 1){
shell(array, gap);
gap /= 2;
}
//最后保证gap是1
shell(array, 1);
}
public static void main(String[] args) {
int[] array = {2,8,5,9,4,6,0,1};
shellSort(array);
System.out.println(Arrays.toString(array));
}
}