首页 > 其他分享 >数据结构学习笔记-希尔排序

数据结构学习笔记-希尔排序

时间:2024-06-03 17:00:07浏览次数:21  
标签:arr 排序 temp int 增量 gap 希尔 printf 数据结构

希尔排序的算法设计与分析

问题描述:设计并分析希尔排序算法

【算法设计思想】

  1. 选择一个初始的增量序列,通常选择数组长度的一半(n/2)作为初始增量。
  2. 对于每个增量,将数组分割成若干个子序列,每个子序列的长度等于当前增量。例如,如果增量为 5,那么数组将被分割成长度为 5 的子序列。
  3. 对每个子序列进行插入排序。插入排序的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。
  4. 逐步缩小增量,重复步骤 2 和 3,直到增量为 1。此时,整个数组已经变成有序序列。

【算法描述】

void shell_sort(int arr[], int n) {
    for (int gap = n / 2; gap > 0; gap /= 2) {
        for (int i = gap; i < n; i++) {
            int temp = arr[i];
            int j;
            for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
                arr[j] = arr[j - gap];
            }
            arr[j] = temp;
        }
    }
}

【完整的测试程序】

#include<stdio.h>

void shell_sort(int arr[], int n) {
    for (int gap = n / 2; gap > 0; gap /= 2) {
        for (int i = gap; i < n; i++) {
            int temp = arr[i];
            int j;
            for (j = i; j >= gap && arr[j - gap] > temp; j -= gap) {
                arr[j] = arr[j - gap];
            }
            arr[j] = temp;
        }
    }
}

int main() {
    int arr[] = {12, 34, 54, 2, 3};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("原始数组:\n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    shell_sort(arr, n);

    printf("排序后的数组:\n");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

标签:arr,排序,temp,int,增量,gap,希尔,printf,数据结构
From: https://www.cnblogs.com/zeta186012/p/18229236

相关文章

  • 【Java数据结构】详解Stack与Queue(一)
    ......
  • 数据结构复习笔记5.1:树
            之前,我们介绍的所有的数据结构都是线性存储结构。本章,我们所介绍的树的结构是⼀种⾮线性的存储结构。存储的是具有⼀对多的关系的数据元素的集合。1.树的定义树是由n(n>=0)个结点组成的有限集,n=0时为空树,且对于非空树:有且仅有一个特定的称为根的结点;当n>1......
  • 数据结构-单链表操作及代码实现(C语言)
    (一)单链表与线性表支持随机访问的特点相比,单链表的特点是适合插入与删除。结构体定义typedefintElementType;//数据元素类型定义typedefstructLNode//单链表结构体定义{ElementTypedata;//数据域structLNode*next;//存储下一个结点的地址}LNode,*L......
  • 数据结构--数组(详细分析)
    目录......
  • 常见的排序算法——快速排序
    本文记述了快速排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想基于分治思想的快速排序,使用切分函数找到一个切分位置,保证其左侧子范围内的所有元素都不大于切分位置的元素,右侧子范围内的所有元素都不小于切分位置的元素。然后用递归调用......
  • 八大排序:插入、希尔、冒泡、选择、快速、堆、归并、计数
    目录一、插入排序:二、希尔排序:三、冒泡排序:四、选择排序:五、快速排序:    1、霍尔法:    2、挖坑法:    3、前后指针法:    4、非递归的实现:六、堆排序:七、归并排序:1、递归实现:2、非递归实现:八、计数排序:一、插入排序:插入排序......
  • 堆排序-java
    这次主要讲了堆排序和堆的基本构造,下一期会详细讲述堆的各种基本操作。文章目录前言一、堆排序1.题目描述2.堆二、算法思路1.堆的存储2.结点下移down3.结点上移up4.堆的基本操作5.堆的初始化三、代码如下1.代码如下:2.读入数据:3.代码运行结果总结前言......
  • 天津科技-Python程序设计基础-数据结构-5
    编写函数avg(a),统计并返回元组a中所有奇数元素的平均值。在主程序中,从键盘输入(以空格分隔)包含若干个元素(数量不固定)的数值元组,调用avg()函数,计算并输出元组中所有奇数元素的平均值(保留2位小数)。输入格式:tuple(map(int,input().split()))输出格式"平均值为{:.2f}".format()......
  • 《java数据结构》--哈希表
    ......
  • 【数据结构】单链表-->详细讲解,后赋源码
    欢迎来到我的Blog,点击关注哦......