首页 > 其他分享 >希尔排序

希尔排序

时间:2023-03-17 18:14:01浏览次数:33  
标签:dk int 步长 希尔 delta 排序 data

【说明】

希尔排序算法又称最小增量排序算法,其基本思想是:
步骤 1:构造一个步长序列 delta1、delta2、..、deltak,其中 delta1=n/2,后面的每个 delta 是前一个的 1/2,deltak=1:
步骤 2:根据步长序列进行 k 趟排序:
步骤 3:对第ⅰ趟排序,根据对应的步长 deta,将等步长位置元素分组,对同一组内元素在原位置上进行直接插入排序。

【代码实现】

#include <stdio.h>
#include <stdlib.h>

void shellSort(int data[], int n) {
    int *delta, k, i, t, dk, j;
    k = n;
    delta = (int *) malloc(sizeof(int) * (n / 2));
    i = 0;
    do {
        k /= 2;
        delta[i++] = k;
    } while (k > 1);

    i = 0;
    while ((dk = delta[i]) > 0) {
        for (k = delta[i]; k < n; ++k) {
            if (data[k - dk] > data[k]) {
                t = data[k];
                for (j = k - dk; j >= 0 && t < data[j]; j -= dk) {
                    data[j + dk] = data[j];
                }
                data[j+dk] = t;
            }
        }
        ++i;
    }
}


int main() {
    int A[] = {2, 5, 6, 1, 4, 7};
    int length = sizeof(A) / sizeof(int);
    shellSort(A, length);
    printf("排序后的数组:");
    for (int i = 0; i < length; i++) {
        printf("%d", A[i]);
    }
    return 0;
}

【算法分析】

时间复杂度:小于O(n^2)
算法稳定性:不稳定

标签:dk,int,步长,希尔,delta,排序,data
From: https://www.cnblogs.com/Smile-yun-1996/p/17227748.html

相关文章

  • python 排序算法
    冒泡排序算法比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。......
  • python中的列表排序
    #列表排序:'''#1.通过sort()方法排序,直接修改原列表defsort_list(list_data,rev=False):L.sort()#reverse默认False升序ifrev:L.sort(reverse=True......
  • 点集从上到下,从左到右进行Z字型排序(C++与python实现,自写)
    C++实现:voidPointDisgus(vector<Point>&Points){Pointt;intn=Points.size();inti,j;vector<Point>OutPoints;vector<Point>Points_......
  • 排序算法01随笔
    日月蹉跎现在是2023年03月17日八点五六分,心中想起一句话:“日月蹉跎人已将老功业未成”每个人心中都有个美好的梦,我们如何去实现它,是否能够坚持下去?又需要付出多少?望......
  • Vue.js 列表渲染-列表排序
    视频<!DOCTYPEhtml><html> <head> <metacharset="UTF-8"/> <title>列表排序</title> <scripttype="text/javascript"src="../js/vue.js"></script> </head>......
  • 基础算法模板之归并排序
    归并排序1.算法分析归并排序是分治的思想,将一个序列分为多个子序列,先让每个子序列有序,再合并已有序的子序列。把长度为n的输入序列分成两个长度为n/2的子序列;对这两个......
  • 基本算法模板之快速排序
    快速排序1.算法描述从数列中挑出一个元素,称为"基准";重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这......
  • python 类中的属性排序
    可以使用Python中的类(class)来定义一个包含姓名和年龄的类。以下是一个示例代码:classPerson:def__init__(self,name,age):self.name=namese......
  • 冒泡排序
    1.描述:冒泡排序是一种常见的排序方法,遍历若干个需要排序的数列,依次比较相邻两个数值的大小,前者比后者大调换位置,渐进式循环后大的数值都会在最后,重复此操作直到出现有序的......
  • list数组转tree树结构,并排序
    setTree(data){consttree=[];data.forEach(item=>{constchildren=this.list.filter(e=>e.parentId===item.id)if(children.length){......