C语言中的希尔排序

C语言实现希尔排序的代码示例,以及每一步的文字讲解。

cs 复制代码
#include <stdio.h>

// 希尔排序的函数
void shellSort(int arr[], int n) {
    // 初始化间隔为n/2
    for (int gap = n / 2; gap > 0; gap /= 2) {
        // 开始进行插入排序
        for (int i = gap; i < n; i += 1) {
            int temp = arr[i];
            int j;
            // 将arr[i]插入到已排序的序列中
            for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
                arr[j] = arr[j - gap];
            }
            arr[j] = temp;
        }
    }
}

// 打印数组的函数
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int n;
    printf("请输入数组的长度:");
    scanf("%d", &n);

    int arr[n];
    printf("请输入数组元素(用空格分隔):");
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    printf("原始数组:");
    printArray(arr, n);

    // 调用希尔排序函数
    shellSort(arr, n);

    printf("排序后的数组:");
    printArray(arr, n);

    return 0;
}

文字讲解:

  1. 首先,我们定义了一个shellSort函数,用于实现希尔排序算法。

  2. 在shellSort函数中,我们首先定义了一个间隔gap,初始值为数组长度的一半。

  3. 使用一个外层循环,不断地减小间隔gap,直到gap为1。

  4. 在内层循环中,我们使用插入排序的思想,将数组元素按照间隔gap进行分组,然后对每组进行插入排序。

  5. 在插入排序的过程中,我们将当前元素与已排序序列中的元素进行比较,如果当前元素较小,则将已排序序列中的元素向后移动,直到找到合适的位置插入当前元素。

  6. printArray函数用于打印数组元素。

  7. 在main函数中,我们首先提示用户输入数组的长度和元素,然后调用printArray函数打印原始数组。

  8. 接着,调用shellSort函数对数组进行排序。

  9. 最后,再次调用printArray函数打印排序后的数组。

运行程序后,用户可以根据提示输入数组长度和元素,程序会输出排序前的数组和排序后的数组。

相关推荐
努力学计算机的小白一枚几秒前
146. LRU 缓存 && 带TTL的LRU缓存实现(拓展)
算法·缓存
uhakadotcom3 分钟前
DeepFM算法:提升CTR预估和推荐系统的强大工具
算法·面试·github
evolution_language19 分钟前
LintCode第974题-求矩阵各节点的最短路径(以0为标准)
算法·最短路径·广度优先搜索
序属秋秋秋25 分钟前
算法基础_基础算法【位运算 + 离散化 + 区间合并】
c语言·c++·学习·算法·蓝桥杯
Phoebe鑫31 分钟前
数据结构每日一题day10(链表)★★★★★
算法
jyyyx的算法博客37 分钟前
【再探图论】深入理解图论经典算法
c++·算法·图论
念_ovo1 小时前
【算法/c++】利用中序遍历和后序遍历建二叉树
数据结构·c++·算法
梭七y1 小时前
【力扣hot100题】(048)二叉树的最近公共祖先
算法·leetcode·职场和发展
luckyme_1 小时前
leetcode-代码随想录-链表-移除链表元素
算法·leetcode·链表
Vitalia1 小时前
⭐算法OJ⭐寻找最短超串【动态规划 + 状态压缩】(C++ 实现)Find the Shortest Superstring
开发语言·c++·算法·动态规划·动态压缩