希尔排序基础实现

#include<iostream>

using namespace std;

void ShellSort(int *a,int length)

{

if (a == NULL || length <= 0)

{

return;

}

int gap = length;

while (gap != 1)

{

if (gap > 1)

{

gap = gap / 3 + 1;

}

for (int begin = gap; begin < length; begin += gap)

{

int index = begin;

int tmp = a[begin];

while (index)

{

if (tmp < a[index - gap])

{

a[index] = a[index - gap];

}

else

{

break;

}

index -= gap;

}

if (tmp < a[index])

{

a[index] = tmp;

}

}

}

}

void SellSortTest()

{

int a[] = { 3, 6, 2, 8, 1, 5, 9, 4, 7, 0 };

ShellSort(a, 10);

for (int i = 0; i < sizeof(a) / sizeof(a[0])-1; i++)

{

cout << a[i] << " ";

}

cout << endl;

}

int main()

{

SellSortTest();

return 0;

}

时间: 2024-10-06 00:53:25

希尔排序基础实现的相关文章

算法基础之希尔排序

希尔排序的实质就是分组插入排序, 是对直接插入排序的改进. 时间复杂度为O(nlongn), 跟快速排序, 堆排序的时间复杂度相同, 是一种较为快速的排序方式. 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的 元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序.因为 直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提

夯实基础——希尔排序

物理结构:数组 希尔排序分析: 最优时间复杂度:O(n) 顺序的情况下 最坏时间复杂度:O(nlog^2n) 平均时间复杂度:根据增量不同而不同 最坏空间复杂度:O(n) 稳定性:不稳定 希尔排序函数: int ShellSort(int a[],int length); //希尔排序,缩小增量的插入排序 int ShellSort(int a[],int length) { int incre=0,i,j,tmp; while(incre<length)//构造增量规则 { incre=inc

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

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

希尔排序总结

数据结构之排序算法——希尔排序 代码很多地方借鉴了  http://my.csdn.net/MoreWindows 他的思想, 本人认为该作者已经写的很好了,只是在他的基础上加入了一些自己的理解和说明 如果涉及到版权的问题,请联系我的邮箱,我会尽快删除 希尔排序想关链接: 维基百科:https://zh.wikipedia.org/wiki/%E5%B8%8C%E5%B0%94%E6%8E%92%E5%BA%8F#C.E8.AA.9E.E8.A8.80 百度百科:http://baike.bai

排序算法入门之希尔排序(java实现)

希尔排序是对插入排序的改进.插入排序是前面元素已经有序了,移动元素是一个一个一次往后移动,当插入的元素比前面排好序的所有元素都小时,则需要将前面所有元素都往后移动.希尔排序有了自己的增量,可以理解为插入排序的增量为1,希尔排序增量是gap.代码就是在插入排序代码的基础上多了一层增量变化的循环.可以参考http://www.cnblogs.com/chengxiao/p/6104371.html,博主作了详尽介绍. public static void shellSort(int[] a){ in

数据结构例程——插入排序之希尔排序

本文是[数据结构基础系列(9):排序]中第3课时[插入排序之希尔排序]的例程. 1.希尔排序 #include <stdio.h> #define MaxSize 20 typedef int KeyType; //定义关键字类型 typedef char InfoType[10]; typedef struct //记录类型 { KeyType key; //关键字项 InfoType data; //其他数据项,类型为InfoType } RecType; //排序的记录类型定义 void

java希尔排序算法

原文:java希尔排序算法 代码下载地址:http://www.zuidaima.com/share/1550463279090688.htm 希尔排序算法的基本思想是:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组.所有距离为dl的倍数的记录放在同一个组中.先在各组内进行直接插人排序:然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<-<d2<d1),即所有记录放在同一组中进行直接插入排序为止.该方法实质上是一种

数据结构之插入排序与希尔排序

1.直接插入排序 直接插入排序是一种最简单的排序算法,它的基本操作是将一个记录插入到已经排序好的序列中,从而得到一个新的有序表.直接插入排序算法原理如下图所示: 直接插入排序算法如下: void InsertSort(int arr[],int length) { int key,j; for(int i=1;i<length;++i) { key=arr[i]; //记录标志; j=i-1; //循环比较并且交换相邻的两个数; while (j>=0&&arr[j]>k

优化的直接插入排序(二分查找插入排序,希尔排序)

直接插入排序 (一)概念及实现 直接插入排序的原理:先将原序列分为有序区和无序区,然后再经过比较和后移操作将无序区元素插入到有序区中. 具体如下(实现为升序): 设数组为a[0…n]. 1.        将原序列分成有序区和无序区.a[0…i-1]为有序区,a[i…n] 为无序区.(i从1开始) 2.        从无序区中取出第一个元素,即a[i],在有序区序列中从后向前扫描. 3.        如果有序元素大于a[i],将有序元素后移到下一位置. 4.        重复步骤3,直到找