插入排序
和顺序表插入十分相似
[0,bound) 已排序区间
[bound,size) 待排序区间
先获取bound位置的元素,往已排序区间插入,插入完毕后已排序任然是有序的
把bound位置的元素在前面找个合适的位置,同时需要搬运附近相关元素
public static void insertSort (int[] array){
//通过bound来划分区间
for (int bound = 1; bound < array.length; bound++) {
int v = array[bound];
int cur = bound - 1;//已排序区间的最后一个下标
for(;cur >= 0;cur--){
//此处写成array[cur] >= v就不是稳定排序了
if(array[cur] > v){
array[cur + 1] = array[cur];
}else{
//此时不需要搬运
break;
}
}
array[cur + 1] = v;
}
}
希尔排序
进阶版本的插入排序,先分组,然后针对每个组进行插入排序
逐渐缩小组gap的个数,最终的整个数组就接近有序了
public static void shellSort(int[] array){
int gap = array.length / 2;
while(gap > 1){
//需要循环进行插排
insertSortGap(array,gap);
gap = gap / 2;
}
insertSortGap(array,1);
}
private static void insertSortGap(int[] array, int gap) {
for(int bound = gap;bound < array.length;bound++){
int v = array[bound];
int cur = bound - gap;
for(;cur >= 0;cur -= gap){
if(array[cur] > v){
array[cur + gap] = array[cur];
}else{
break;
}
}
array[cur + gap] = v;
}
}