数据结构之---C语言实现希尔排序

//希尔排序Shell Sort
//杨鑫
#include <stdio.h>
#include <stdlib.h>
void ShellSort(int a[], int length)
{
	int increment;
	int i,j;
	int temp;
	for(increment = length/2; increment > 0; increment /= 2) //用来控制步长,最后递减到1
	{
		// i从第step开始排列,应为插入排序的第一个元素
		// 可以先不动,从第二个开始排序
		for(i = increment; i < length; i++)
		{
			temp = a[i];
			for(j = i - increment; j >= 0 && temp < a[j]; j -= increment)
			{
				a[j + increment] = a[j];
			}
			a[j + increment] = temp; //将第一个位置填上
		}
	}
}

int main()
{
	printf("==============希尔排序===============\n\n");
	int i, j;
	int a[] = {5, 18, 151, 138, 160, 63, 174, 169, 79, 200};
	printf("待排序的序列是: \n");
	for(i = 0; i < 10; i++)
	{
		printf("%d ", a[i]);
	}
	ShellSort(a, 10);
	printf("\n排序后的序列是: \n");
	for(j = 0; j < 10; j++)
	{
		printf("%d ", a[j]);
	}
	printf("\n");
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 19:09:51

数据结构之---C语言实现希尔排序的相关文章

小朋友学数据结构(9):希尔排序

小朋友学数据结构(9):希尔排序 (一)基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止. (二)例子 有一个数组,其原始数组为: 2-1.png 取初始增量gap = length / 2 = 5,这样就将整个数组分为5组(每组用相同的颜色表示) 2-2.png 将这5组的数据分别按由小到大的顺序排列,结果为 2-3.png 缩小增量gap = gap / 2 = 2,整

Hark的数据结构与算法练习之希尔排序

算法说明 希尔排序是插入排序的优化版. 插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度. 希尔排序的目的就是通过一个increment(增量)来对数列分组进行交换排序,最终使数列几乎有序,最后再执行插入排序,统计出结果. 通过increment=n/2, 也就是如果9个数的话,增量为4,2,1.   如果是20个数的话,增量就是10,5,2,1.  当increment为1时,其实对几乎有序的数列进行插入排序啦啦. 时间复杂度 O(n

一起talk C栗子吧(第二十八回:C语言实例--希尔排序)

各位看官们,大家好,上一回中咱们说的是插入排序的例子,这一回咱们说的例子是:希尔排序.闲话休 提,言归正转.让我们一起talk C栗子吧! 希尔排序是对插入排序的一种改进,希尔排序的原理:先将容器分成若干子容器,然后分别对子容器进行 插入排序,当子容器全部排序完毕后,对全部元素进行一次插入排序. 希尔排序的实现步骤: 1.选取一个增量,增量的大小可以自己定义,其大小在1到容器长度之间: 2.以容器头部到增量位置的元素为起点,从起点到容器尾部依次遍历容器: 3.在步骤2中的遍历过程中,选择一个当前

野生前端的数据结构练习(10)希尔排序,归并排序,快速排序

一.希尔排序 shell sort也称缩小增量排序,是对插入排序算法的改进,其工作原理是定义一个间隔序列来表示排序过程中进行比较的元素之间有多远的间隔,每次将具有相同间隔的数分为一组,进行插入排序,大部分场景中,间隔是可以提前定义好的,也可以动态生成.在较大的数据集上,希尔排序对于插排的优化效果是非常明显的. ./** * 希尔排序示例代码 */ function shellSort(gaps, arr) { for(let g = 0; g < gaps.length; g++){ let h

数据结构和算法基础之希尔排序

/// <summary> /// 希尔排序 /// 属于插入类排序,是将整个无序列分割成若干小的子序列分别进行插入排序 /// 排序过程:先取一个正整数d1<n, /// 把所有序号相隔d1的数组元素放一组,组内进行直接插入排序: /// 然后取d2<d1, /// 重复上述分组和排序操作:直至di=1,即所有记录放进一个组中排序为止 /// </summary> /// <param name="arry"></param>

数据结构之---C语言实现拓扑排序AOV图

//有向图的拓扑排序 //杨鑫 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME 3 #define MAX_VERTEX_NUM 20 typedef int InfoType; //存放网的权值 typedef char VertexType[MAX_NAME]; //字符串类型 typedef enum{DG, DN, AG, AN}GraphKind; //{有

数据结构与算法——插入排序与希尔排序

void Insertsort(int a[], int n){    int i, j;    int Tmp;    for (i = 1; i < n; i++)//from the second element        for (j = i - 1; j >= 0 && a[j] > a[j + 1]; j--){  //from the i-1 begin to compare until the first element             Tmp

排序之希尔排序

从刚开始本科学习数据结构的时候,对希尔排序就一直稀里糊涂的,弄不清到底怎么回事,重温知识,对此才稍加了解,希尔排序就是插入排序,不过它对插入排序进行了一些优化,我们之道,插入排序的性能与初始序列的排序状况有关,假设需要的排序效果是从小到达,如果给定的序列原本就是有序的,那么排序的时候只需遍历一遍数组就可以了:但是,如果给定的序列原本是逆序的,必须 5 4 3 2 1,那么对数组的中的数据(注意,这里是数据,而非数组)扫描的次数大约是(5+4+3+2+1)次,也就是说如果给定n个数据,排序的时间复

JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序

1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习. 之所以把归并排序.快速排序.希尔排序.堆排序放在一起比较,是因为它们的平均时间复杂度都为 O(nlogn). 请大家带着问题:快排和归并用的都是分治思想,递推公式和递归代码也非常相似,那它们的区别在哪里呢 ? 来阅读下文. 2. 归并排序(Merge Sort) 思想 排序一个数