首页 > 其他分享 >考研数据结构——每日一题[希尔排序]

考研数据结构——每日一题[希尔排序]

时间:2023-08-20 11:31:49浏览次数:35  
标签:sort 排序 下标 int 插入排序 start 数据结构 考研

shell_sort希尔排序


//每组内的下标是等差数列
//c++中的sort是快排+插排 【当排序到<28时改为插入排序】
void shell_sort()  // 希尔排序【分组的插入排序】 不稳定(间隔d的分为一组)
{
    for (int d = n / 3; d; d = d == 2 ? 1 : d / 3) //特判2,等于2就用1,(最后要用1,而2时d/3=0,所以特判) 【d为分组跨度(此时初始每组3个元素)】
    {
        for (int start = 0; start < d; start ++ )//分为d组,每组成员之间间隔为d,组内插入排序
        {
            for (int i = start + d; i < n; i += d)//比较一组 
            {
                int t = q[i], j = i;//j存同一组内小的下标 
                while (d != 0 && q[j - d] > t) //d != 0时(j > start) && 做以下标间隔d的插入排序
                {
                    q[j] = q[j - d];
                    j -= d;
                }
                q[j] = t; 
            }
        }
    }
}


//科学家证明过 用除3分组O(n^(3/2)) 
void shell_sort() //用除2,分组 O(n^2) 
{
	for(int d = n / 2; d ;d /= 2 ) //分为d组,每组成员之间间隔为d,组内插入排序 
	{
		for(int start = 0;start < d; start ++)//比较d组   
		{
			for(int i = start + d ;i < n;i += d)//比较一组 
			{
				int t = q[i] , j = i; //j存同一组内小的下标 
				while(j > start && q[j - d] > t) //相隔为d的分为一组比较 
				{
					q[j] = q[j - d];//后移,下标小的赋值给下标大的
					j -= d;
				}
				q[j] = t;
			}
		}
	}
}

标签:sort,排序,下标,int,插入排序,start,数据结构,考研
From: https://blog.51cto.com/u_15623277/7159945

相关文章

  • 数据结构学习记录(一)
    堆栈与队列一、知识要点1、堆栈堆栈的定义堆栈(Stack)是一种具有一定约束的线性表,插入和删除操作都作用在一个称为栈顶(Top)的端点位置。通常把数据插入称为压入栈(Push),删除数据称为弹出栈(Pop)。在堆栈中,最后入栈的数据被最先弹出,所以堆栈也被称为后入先出。堆栈的抽象数据......
  • COMP3506/7505 算法与数据结构
    AssignmentOne–15%AlgorithmsandDataStructures–COMP3506/7505–Semester2,2023Due:3pmonFridaySeptember1st(week6)SummaryThemainobjectiveofthisassignmentistogetyourhandsdirtywithsomesimpledatastructuresandalgorithmstosolveb......
  • 归并,基数排序及排序分析
    归并,基数排序及排序分析归并排序将两个或两个以上的有序子序列"归并"为一个有序的序列.归并排序的演示归并需要logn趟如何将两个有序序列合成一个有序序列?使用前面学的两个线性表的合并在同一个有序序列里面的合并操作归并排序算法分析归并排序方法的比较基数......
  • 选择冒泡插入排序 异或 二分 对数器
    算法时间复杂度O(x)空间复杂度O(x)数据状况是否影响时间复杂度表现选择排序n21否冒泡排序n21否插入排序n21是(最好情况下O(N))1.选择排序:遍历找出0~n-1最小的数放在0位置,遍历找出1~n-1最小的数放在1位置时间复杂度O(n2) 空间复杂度O(1)voidswap(vector<int>&nums,inti,intj......
  • 经典c语言排序算法
    前言前段时间偶然在公众号中看到了一篇汇总c语言排序算法的文章,感觉蛮不错的,这里直接copy记录下,学习积累一下。演示C语言经典排序算法(qq.com)排序算法简介1.算法分类十种常见排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(n......
  • 算法复杂度和简单排序
    选择排序和冒泡排序选择排序是O(n2),每次选取最大的,放在最前面,然后下次从第二个开始找到最后一个。冒泡也是O(n2),一直交换到最后。插入排序插入排序最坏是O(n2),最好是O(n),但是算法一般都是按照最坏的来。插入是先排序0-1,然后0-2,然后0-3,eq.:排序0-5时,0-4已经排序好了,只需要......
  • C#数据结构
    C#数据结构一、数组(Array)定义元素序列,存放形同类型的变量,对象,每一项都有一个整数索引(下标);元素位于一个连续存储的内存块中;数组空间大小是固定的。数组分类一维数组,多维数组(等于或大于二维)数组的优点:随机访问性强,查找速度快,时间复杂度是0(1)数组的缺点:3.1从头部删除、从......
  • 蜗牛排序
    题目:  ——————————————————————————————————————————————————————————解答:#include<iostream>#include<vector>usingnamespacestd;vector<int>snail(vector<vector<int>>&array){vector<int>ret......
  • 【LeetCode2118. 建立方程】 group_concat指定分隔符,指定排序顺序
    目录题目地址题目描述代码题目地址https://leetcode.cn/problems/build-the-equation/description/题目描述Example2:输入:Terms表:+-------+--------+|power|factor|+-------+--------+|4|-4||2|1||1|-1|+-------+---......
  • 归并排序
    publicstaticvoidmerge(int[]arr,intlow,intmiddle,inthigh){    int[]temp=newint[high-low+1];    inti=low;               //第一个数组需要遍历的下标    intj=middle+1;          //第二......