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

排序4-希尔排序

时间:2024-04-23 17:59:46浏览次数:27  
标签:arr int MAX 插入排序 increasement 希尔 排序

排序4-希尔排序


插入排序在以下情况时效率较高
  1. 当元素序列基本有序

  2. 元素个数较少

希尔排序是对插入排序的优化

希尔排序先将元素分组(通常为总长度的一半, 例如有8个数据量, 则将数据分为4组, 每组2个数据),

然后再对每一组元素单独进行插入排序, 创造出满足上述2个条件的情况


示意(间隔为2, 分组为2)

数据分别排序后归位, 相对有序的序列, 对整体进行一次插入排序


希尔排序

void shellSort(int arr[], int length){
    int i,j,k;
    //增量(等于1时,全部元素归为一组, 进行直接的插入排序)
    int increasement = length;
    do{
        //确定分组的增量
        increasement = increasement/3 + 1; //减少增量
        for (i = 0; i < increasement; i++){
            //对每一组都进行插入排序
            for (j = i+increasement; j < length; j+=increasement){
                if(arr[j] < arr[j-increasement]){
                    int tmp = arr[j];
                    for (k = j-increasement; k>=0 && tmp<arr[k]; k-=increasement){
                        arr[k+increasement] = arr[k];
                    }
                    arr[k+increasement] = tmp;
                }            
            }

        }
    }while(increasement>1); //直到增量为1
}

与插入排序效率比较

int main(){
    int arr[MAX];
    int arr2[MAX];
    int randNum;
    srand((unsigned int)time(NULL));
    for (int i = 0; i < MAX; i++){
        randNum = rand() % MAX;
        arr[i] = randNum;
        arr2[i] = randNum;
    }

    long t1 = getSystemTime();
    shellSort(arr,MAX);
    long t2 = getSystemTime();
    cout << "希尔排序" << MAX << "个元素耗时:" << t2-t1 << "ms" << endl;

    long t3 = getSystemTime();
    insertSort(arr2,MAX);
    long t4 = getSystemTime();
    cout << "插入排序" << MAX << "个元素耗时:" << t4-t3 << "ms" << endl;

    system("pause");
    return 0;
}

标签:arr,int,MAX,插入排序,increasement,希尔,排序
From: https://www.cnblogs.com/HIK4RU44/p/18153418

相关文章

  • 归并排序
    归并排序是一种基于分治的算法,下面给出我的数组式(半数组,有偏移理解)代码:点击查看代码//注意:我的答案数组下标开始为1,且所有操作区间均为闭区间//时间复杂度:稳定o(nlogn)//空间复杂度:o(n),栈空间:o(nlogn),若开全局数组则可忽略栈空间#include<bits/stdc++.h>using......
  • 快速排序法
    第一种写法:定标杆在起点时间复杂度:平均o(nlogn),最坏o(n^2)代码如下:点击查看代码#include<bits/stdc++.h>usingnamespacestd;voidquick_sort(inta[],intb,inte){if(b>=e)return;inttemp=a[b];inti=b,j=e;while(i<j){......
  • 说说你对选择排序的理解?如何实现?应用场景?
    一、是什么选择排序(Selectionsort)是一种简单直观的排序算法,无论什么数据进去都是 O(n²)的时间复杂度,所以用到它的时候,数据规模越小越好其基本思想是:首先在未排序的数列中找到最小(or最大)元素,然后将其存放到数列的起始位置然后再从剩余未排序的元素中继续寻找最小(or最大)......
  • vis.js滚动和排序
    代码案例<!doctypehtml><html><head><title>Timeline</title><scripttype="text/javascript"src="https://unpkg.com/vis-timeline@latest/standalone/umd/vis-timeline-graph2d.min.js"></script>......
  • 排序3-插入排序
    排序3-插入排序插入排序把排序对象分成已排序和未排序两个部分,每次选取未排序部分的首元素,将它插入已排序部分的合适部分插入排序(正序)//插入排序voidinsertSort(intarr[],intlength){intj;for(inti=1;i<length;i++){//i是无序部分首元素的下标......
  • 常见的排序算法——归并排序
    本文记述了自顶向下归并排序的基本思想和一份参考实现代码,并在说明了算法的性能后用随机数据进行了验证。◆思想使用自顶向下的分治思想进行排序。将待排序元素分为两个待排序子范围,用递归的方式对两个子范围分别排序。然后将排序结果归并起来,即得到整体排序的结果。归并两个已......
  • SQL Server 中将字符串按数字排序
    方法一:使用CAST或CONVERT我们可以使用CAST或CONVERT函数将字符串转换为数字,然后按照数字进行排序。示例如下:SELECT*FROMYourTableORDERBYCAST(YourColumnASINT)方法二:使用TRY_CAST或TRY_CONVERT如果我们不确定字符串中的所有值都可以成功转换为数字,我们可......
  • 排序2-选择排序
    排序2-选择排序每次找到最值的下标,最后交换元素,每次遍历的元素减少.减少了交换元素的次数.性能较冒泡排序更好一点,但时间复杂度仍是$O(n^2)$交换元素//交换voidSwap(int*a,int*b){inttmp=*a;*a=*b;*b=tmp;}打印数组voidPrintArray(......
  • 过滤与排序
    排序与过滤​ 查询所有才需要过滤,排序是按照某个规则排序排序简单使用导入类OrderingFilter在视图类重写filter_backends属性,在列表内填入导入的类重写ordering_fields属性,在列表内填入字段classBookView(ModelViewSet):queryset=Book.objects.all()serial......
  • 排序1-冒泡排序
    排序1-冒泡排序冒泡排序的次数是递减的,第一次确定了最大元素的位置,所以第二次只需要进行n-1次排列,第二次确定了第二大元素的位置,所以第三次只需要进行n-2次排列,以此类推for(inti=0;i<len;i++){//每次遍历的次数是递减的//所以j=len-1-i......