一. 希尔排序
希尔排序是在插入排序的基础上进行的优化,弥补了插入排序存在的一些缺点。例如,我们由一个长度为非常长的数组,刚好最小的值是在最后面,如果我们用插入排序的话需要移动的元素太多了,那我们有什么办法将其更快的靠近下标为0的位置呢?这时我们就有了希尔排序。
希尔排序又称最小增量排序,我们需要一个最小增量gap,gap = 数组长度 / 2,将间隔为gap的数字为一组,对这一组的数据进行插入排序,每次排好gap /= 2。现在我们对其进行拆分讲解。
假设我们有一个数组nums[] = {8, 7, 6, 5, 4, 3, 2, 1};
该数组的长度为8,我们令gap = 8 / 2 = 4。则进行如下分类,相同颜色为一组。
将相同颜色的数据进行插入排序后得到:
这时我们令gap /= 2得 gap = 2,则有如下组合
在经过一轮插入排序后。
扫描二维码关注公众号,回复:
13585139 查看本文章
最后gap = 2 / 2 = 1,将所有元素并为一组。
代码如下:
#include <stdio.h>
void ShellSort(int* nums, int n){
//最外层循环由gap控制
for(int gap = n / 2; gap > 0; gap /= 2){
//开始进行分组
for(int i = gap; i < n; i++){
//对每组数据进行插入排序
int j;
int tmp = nums[i];//记录下nums[i]
for(j = i; j >= gap; j -= gap){
if(tmp < nums[j - gap]){
nums[j] = nums[j - gap];
}
else{
break;
}
}
nums[j] = tmp;
}
}
}
int main(){
int nums[] = {
8, 7, 6, 5, 4, 3, 2, 1};
int len = sizeof(nums) / sizeof(nums[0]);
ShellSort(nums, len);
for(int i = 0; i < len; i++){
printf("%d ", nums[i]);
}
return 0;
}
二. 推荐专栏
三. 相关练习
排序数组
题目链接
912. 排序数组
我们通过希尔排序算法,对数组nums进行排序即可。
代码如下:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
void ShellSort(int *nums, int n){
for(int gap = n / 2; gap > 0; gap /= 2){
for(int i = gap; i < n; i++){
int j;
int tmp = nums[i];
for(j = i; j >= gap; j -= gap){
if(tmp < nums[j - gap]){
nums[j] = nums[j - gap];
}
else{
break;
}
}
nums[j] = tmp;
}
}
}
int* sortArray(int* nums, int numsSize, int* returnSize){
*returnSize = numsSize;
ShellSort(nums,numsSize);
return nums;
}