数据结构与算法——希尔排序(shell排序)

//希尔排序(shell排序)
#include<iostream>
using namespace std;
void print(int a[], int n ,int i)
{
cout<<i <<":";
for(int j= 0; j<n; j++)
{
cout<<a[j] <<" ";
}
cout<<endl;
}
/* 直接插入排序的一般形式 *
* d 缩小增量,如果是直接插入排序,d=1 */
void ShellInsertSort(int a[], int n, int d)
{
for(int i= d; i<n; ++i)
{
if(a[i] < a[i-d])//若i所处位置的数大于i-d位置的数,则直接插入,否则元素移动,腾出空间后插入
{
int j = i-d;
int x = a[i]; //复制为哨兵,即存储待排序元素
while(x < a[j]) //查找在有序表的插入位置
{
a[j+d] = a[j];
j -= d; //元素后移
}
a[j+d] = x; //插入到正确位置
}
print(a, n,i );
}
}
/** 先按增量d(n/2,n为要排序数的个数)进行希尔排序**/
void shellSort(int a[], int n)
{
int d = n/2;
while( d >= 1 )
{
ShellInsertSort(a, n, d);
d = d/2;
}
}
int main( )
{
int a[9] = {1,1,5,7,2,4,9,6,8};
int length=sizeof(a)/sizeof(a[0]);
shellSort(a,length); //希尔插入排序
print(a,length,length);
}

时间: 2024-12-18 01:51:18

数据结构与算法——希尔排序(shell排序)的相关文章

Java排序算法(四):Shell排序

[基本的想法] 将原本有大量记录数的记录进行分组.切割成若干个子序列,此时每一个子序列待排序的记录个数就比較少了,然后在这些子序列内分别进行直接插入排序,当整个序列都基本有序时.再对全体记录进行一次直接插入排序. 所谓的基本有序,就是小的keyword基本在前面,大的基本在后面,不大不小的基本在中间.像{2, 1, 3, 6, 4, 7, 5, 8, 9}这样能够称为基本有序了. [java实现] public class ShellSort { public static void main(

数据结构和算法17 之拓扑排序

本文为博主原创文章,转载请注明出处:http://blog.csdn.net/eson_15/article/details/51194219 这一节我们学习一个新的排序算法,准确的来说,应该叫"有向图的拓扑排序".所谓有向图,就是A->B,但是B不能到A.与无向图的区别是,它的边在邻接矩阵里只有一项(友情提示:如果对图这种数据结构部不太了解的话,可以先看一下这篇博文:数据结构和算法之 无向图.因为拓扑排序是基于图这种数据结构的). 有向图的邻接矩阵如下表所示: A B C A

数据结构与算法系列十(排序算法概述)

1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法?

Hark的数据结构与算法练习之鸡尾酒排序

算法说明 鸡尾酒排序又叫定向冒泡排序,鸡尾酒搅拌排序,搅拌排序,涟漪排序,回来排序,快乐小时排序. 鸡尾酒排序是交换排序的一种,它是冒泡排序的一个轻微的变种.冒泡是从低向高比较排序,鸡尾酒从低向高,从高向低交换着进行排序.大家看一下代码就知道了. 某些特殊有序数组情况下,鸡尾酒排序是效率略好于冒泡排序,例如: int[] arrayData = { 2, 3, 4, 5, 6, 7, 8, 9, 1 }; 鸡尾酒排序只排序一次就能出结果,而冒泡排序就需要8次才能出结果. 代码 使用的是java

python数据结构与算法第八天【排序算法】

1.排序算法的稳定性 稳定排序算法会让原本有相同键值的记录维持相对次序 例如:对以下元组按照元组的第一个元素升序排列,元组如下: (4,1) (3,1) (3,7) (5,6) 若要满足条件,则可能的排序有: 情况一: (3,1) (3,7) (4,1) (5,6) 情况二: (3,7) (3,1) (4,1) (5,6) 虽然情况一和情况二都是满足条件的,但是情况二在满足条件下打破了原本无需改变的顺序 原文地址:https://www.cnblogs.com/liuzhiqaingxyz/p/

排序-shell排序

在插入排序中,所有的元素都是挨个和前一个元素进行比较,并置换位置.所以交换的次数为N的平方级别.极端情况下,如果最小元素在最右侧,那么需要逐个和前面元素进行置换.如果将比较的间隔增大,那么会减少移动次数,然后逐次降低比较间隔. 于是比较的间隔的序列如下 h = 3*h+1. 代码如下: 1 #include <iostream> 2 3 using namespace std; 4 5 void change(int *p,int pos1,int pos2); 6 void shellSor

数据结构与算法系列研究九——排序算法的一些探讨

四种排序 一.实验内容     输入20个整数,分别用希尔排序.快速排序.堆排序和归并排序实现由小到大排序并输出排序结果.二.关键数据结构与核心算法   关键数据结构:由于是排序为了简单起见,选用线性表中的数组作为存储结构.   核心算法:   1.希尔排序    希尔排序的核心还是直接插入法,但是插入的位置有所讲究.要把数组分为许多段,每一段的长度除了最后的有可能不同之外,其他的都相同.该段的长度即为增量,在最后一次必须为一,此时程序变成了直接插入.每次进行隔段插入,不断地调整是的数组变得隔段

Hark的数据结构与算法练习之煎饼排序

算法说明 假设煎锅里边有N个煎饼摞在了一起,它们大小不一并且顺序不一致,我们需要通过拿铲子将它们不停的翻个,进行排序,最终得到一个底下是大的煎饼,上边是小的煎饼的序列.这个排序的过程就是煎饼排序. 这个算法有两种解,一种是普通解,一种是最优解. 普通论证: 例如你的初始煎饼顺序是[2,4,3,1] 然后2与4交换位置,然后4与1交换位置,得出[1,3,2,4]. 然后3与1交换位置,接着3与2交换位置,得出[2,1,3,4]. 最后2与1交换位置,得出结果[1,2,3,4] 通过普通解的过程,我

Hark的数据结构与算法练习之图书馆排序

算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移.而图书馆排序的思路就是将每个元素后边都预留N个空间(例如预留10个元素空间),这样往某个元素前插入时,在预留空间足够的前题下,只会移动少少几个的元素. 代码 因为4月要考试,所以代码暂不写,以后有时间时补上 参考 http://www.cnblogs.com/kkun/archive/2011/1