1.1 直接插入排序
直接插入排序是一种简单的插入排序法,其基本思想是:把数组中未排序的部分依次插入到一个有序的序列中。那么数组的本质就是假设第一个有序,把后面的数依次插入到前面的有序序列中
一次排序思想如下:
假设[0, end] 区间是有序的,将end+1插入到前面
cpp
void PrintArray(int* a, int n){
int end;
int tmp = a[end+1];
while (end >= 0) {
if(tmp < a[end]){
a[end] = a[end+1];
}
else{
break;
}
end--;
}
a[end+1] = tmp;//防止tmp是最小的数
printf("\n");
}
数组排序思想:
假设第一个有序,那么第一个就是end,后面的依次往前插入
cpp
void InsertSort(int* a, int n){
for (int i = 0; i < n-1; i++) {
int end = i;
int tmp = a[end+1];
while (end >= 0) {
if(tmp < a[end]){
a[end+1] = a[end];//不能是a[end] = a[end+1]
}
else{
break;
}
end--;
}
a[end+1] = tmp;//防止tmp是最小的数+插入(本质是替换)
}
}
1.2 希尔排序
希尔排序就是直接插入排序的升级版,它的主要思想如下:
-
进行预排序,使得目标数组接近有序,大的更快放到后面的位置,小的更快放到前面的位置
-
进行直接插入排序,完成最后的排序
预排序:
选择每间隔几个数据进行直接插入排序,设置gap的值
最终gap = 1;完成排序
希尔排序的gap问题:
一般取增量 gap = gap/2 ;
代码实现如下:
cpp
void ShellSort(int* a, int n){
int gap = n;
while (gap > 1 ) {
gap /= 2;//最后一个数gap一定等于1
for (int h = 0; h < gap; h++) {//gap组进行预排序
for (int i = 0; i < n-gap; i += gap) {//每一组排序
int end = i;
int tmp = a[end+gap];
while (end >= 0) {
if(tmp < a[end]){
a[end+gap] = a[end];
}else{
break;
}
end -= gap;
}
a[end+gap] = tmp;
}
}
}
}