[题解]《算法零基础100讲》(第38讲) 排序进阶 - 希尔排序

一. 希尔排序

  希尔排序是在插入排序的基础上进行的优化,弥补了插入排序存在的一些缺点。例如,我们由一个长度为非常长的数组,刚好最小的值是在最后面,如果我们用插入排序的话需要移动的元素太多了,那我们有什么办法将其更快的靠近下标为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;
}

二. 推荐专栏

《算法零基础100讲》(第38讲) 排序进阶 - 希尔排序

三. 相关练习

排序数组

题目链接
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;
}

猜你喜欢

转载自blog.csdn.net/qq_53060585/article/details/121581277