希尔排序算法

/* Date:2014.12.14

希尔排序思路:基于插入排序的思想。

流程:1).将有 n 个元素的数组分成 n/2 对,第1个数据和第(n/2 + 1)个数据为一对,依次配对;

2).一次循环使每一个序列对排好顺序;

3).再分为 n/4 对进行排序;

4).重复操作,随序列对数的减少最后变为1个,就完成了整个序列的排序。

时间复杂度:最差(O(ns) 1<s<2),平均O(nlogn).

空间复杂度:O(1).

是一种  不稳定  的排序算法.

*/

void ShellSort(int *arr,int len)

{

int i,j,k;

int r,temp;

int t = 0;

for (r = len/2;r >= 1;r /= 2)

{

for (i = r;i < len;i ++)

{

temp = arr[i];

j = i - r;

while (j >= 0 && temp < arr[j])

{

arr[j + r] = arr[j];

j -= r;

}

arr[j + r] = temp;

}

t ++;

printf("第 %d 步排序结果为:",t);

for (k = 0;k < len;k ++)

{

printf("%d ",arr[k]);

}

printf("\n");

}

}

时间: 2024-11-13 19:01:38

希尔排序算法的相关文章

希尔排序算法实现(1099)

p { margin-bottom: 0.25cm; line-height: 120% } 描述 编程实现希尔排序算法,按照非递减排序,测试数据为整数. input 第一行是待排序数据元素的个数n: 第二行是待排序的数据元素. output 一趟希尔排序后的结果. 样例输入 10 50 36 41 19 23 4 20 18 12 22 样例输出 4 20 18 12 22 50 36 41 19 23 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一

数据结构精要------直接插入排序和希尔排序算法

上篇总结中主要实践了算法的内排序的选择排序,那么接下来我们继续实践插入排序排序的两种:直接插入排序和希尔排序算法. -----直接插入排序 package com.sort; /** * 直接插入排序 * * @author weixing-yang * * 算法思路: * 每步将一个待排序的元素,插入到前面已排序好的一组元素中的适当位置, * 直到所有元素全部出入完成为止. */ public class InsertionSort { public void insertionSort(in

java希尔排序算法

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

排序算法之 Java希尔排序算法

package net.qh.test.sort; import java.util.ArrayList; import java.util.Calendar; import java.util.List; /** * Created by Administrator on 2016/03/01. */ public class Shell { public int[] sort(int[] arr){ if ( arr == null || arr.length <= 1 ){ return

排序系列 之 希尔排序算法 —— Java实现

基本思想: 希尔排序的实质就是分组插入排序,又称缩小增量法. 将整个无序序列分割成若干个子序列(由相隔某个"增量"的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序时,再对全体元素进行一次直接插入排序. 因为直接插入排序在元素基本有序的情况下,效率是很高的,因此希尔排序在时间效率上有很大提高. 实例: 无序序列:int a[] = {3,1,5,7,2,4,9,6}; 第一趟时: n=8; gap=n/2=4; 把整个序列共分成了4个子序列{3,

【排序】希尔排序算法

    特别说明: 对于算法,重在理解其思想.解决问题的方法,思路.因此,以下内容全都假定待排序序列的存储结构为:顺序存储结构.     希尔排序算法摘要: 希尔排序又称为“缩小增量排序”.直接插入排序算法在效率上虽说没办法突破 ,但其在少量数据或待排序列基本有序的情况下,效率却是非常高效的.因此,为进一步提高排序算法的效率,就需要适当地构造前述的那些条件.希尔排序就是第一批突破排序算法时间复杂度  的一个算法.因此,希尔排序算法算是一种属于插入排序类别的方法. 希尔排序算法思想: 算法总体描述

数据结构——排序——希尔排序算法

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本.希尔排序是非稳定排序算法. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位 原始的算法实现在最坏的情况下需要进行O(n2)的比较和交换.V. Pratt的书对算法进行了少量修改,可以使得性能提升至O(nlog2n).这比最好的比较算法的O(nlogn)要差一些. 希尔排序通过将比较

希尔排序算法——缩小增量法排序

希尔排序--1959年shell提出而得名,也称为缩小增量排序算法,它是直接插入排序的改进,效率比较高,适合于中小规模的排序. 具体的算法实现步骤为:首先得知道直接插入排序的算法,然后就是选择增量给原数列进行分组,对每个分得的小组进行直接插入排序便可,然后逐渐减小这个增量,依然进行新的分组的直接插入排序,直到增量为1,此时数列便是有序数列了.具体的代码如下: 首先是对特定的增量的分组的直接插入排序: void _insert(int *A,int d,int length) //d为增量 { i

排序——希尔排序算法实现

最近在和师兄探讨希尔排序的实现原理,得到了师兄的点拨. 进入正题,讲希尔排序首先就要将插入排序,插入排序的原理很简单:给定数组a的[ first,last)区间,经过 i-1次排序之后,a[first]...a[first+i-1]已排好序.第 i  遍处理就是将 a[first+i]插入到a[first]...a[first+i-1]中合适的位置.,是的啊a[first]...a[first+i]成为一个排好序的序列.     可以利用顺序比较的方法来实现. 由于插入排序很简单,所以就不BB了