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

  希尔排序又叫做递减增量排序。在这种排序中,我们将设置一个步长(增量),我们在比较数据时根据增量去进行比较,这样我们的数据会一次性前进很多步,所以希尔排序的效率要比直接插入排序的效率高。

  希尔排序的思想就是我们设置一个步长,然后我们根据这个步长进行划分子序列,得到子序列1,子序列2....,然后我们对每个子序列进行直接插入排序,我们也知道当整个数列基本有序的时候使用直接插入排序的效率是非常高的。然后我们缩小步长,则我们划分的子序列的个数越来越少,我们每个子序列中的数据越来越多,则我们基本有序的数据就越来越多,直到我们的增量为1时,我们对整个已经基本有序的序列采用一次直接插入排序,则我们的排序结束。

  还是按照往常的习惯,给出图示

  好了,下面直接给出代码,代码里面都有详细的注释。

 1 #include <stdio.h>
 2
 3 void shellsort(int *arr[],int length);
 4
 5 int main(int argc, char *argv[])
 6 {
 7     int arr[]={
 8         13,14,94,33,82,25,59,94,65,23,45,27,73,25,39
 9     };
10     shellsort(arr,15);
11     int i=0;
12     for(;i<15;i++){
13         printf("%d ",arr[i]);
14     }
15     return 0;
16 }
17
18
19 /*
20 希尔排序:
21     直接插入排序的改进版,直接插入排序每次只能移动一位,而希尔排序根据特定的步长,移动距离大大增加。
22     希尔排序就是减少增量的排序方法,给出初始设定一个增量,然后根据这个增量将整个序列进行划分,划分成若干个子序列,然后对每
23 个子序列进行直接插入排序。
24     然后再将增量减少,然后再将整个序列划分成若干个子序列,然后在对每个子序列进行直接插入排序,依次类推,直到增量为1时,即
25 对整个序列进行直接插入排序,因为现在的序列已经基本有序,则直接插入排序的效率较高,这样完成后,我们的整个序列就完全有序。
26 */
27
28
29 void shellsort(int *arr[],int length){
30     int gap=length/2;  //初始设置增量为数组长度的一半,则我们的每个子序列只有两个数据
31
32     for(;gap>=1;gap=gap/2){  //我们每次的排序都是根据步长来确定的,而我们的步长每次排序完成后都要改变,直到步长为1,我们这里采用的步长长度每次为一半
33         //在上面设置了步长以后,则我们的待排序数组已经被分成若干个子序列了,则我们对每个子序列进行直接插入排序
34
35         int m;
36         for(m=0;m<gap;m++){  //我们在这里设置一个循环,这个循环我们用于对每个子序列的起点进行设置,每个子序列的起点都是在0到gap之间的
37             //这样我们就可以把子序列抽离出来,分别是m,m+gap,m+gap+gap...,则我们对这个序列进行直接插入排序
38              int i;
39              int temp;
40              for(i=m+gap;i<length;i=i+gap){  //我们对这个序列进行直接插入排序
41                  int j=i;  //在这里我们单独定义一个j出来,不能直接对i进行操作,直接操作i以后,i会发生变化,则我们的遍历对象不准确了
42
43                   while(j!=m){
44                       if(arr[j]<=arr[j-gap]){  //这个子序列相邻元素之间的距离不再是1,而是gap
45                           temp=arr[j-gap];
46                           arr[j-gap]=arr[j];
47                           arr[j]=temp;
48                       }
49                       j=j-gap;  //下标跳转到下一个元素
50                   }
51              }
52
53         }
54
55     }
56 } 

  ok,以上就是希尔排序的基本原理和代码实现。

  本文属于博主原创,转载请标明出处。

  http://www.cnblogs.com/WuNaiHuaLuo/

时间: 2024-08-01 22:37:53

数据结构排序算法之希尔排序的相关文章

【数据结构与算法】希尔排序

希尔排序的时间复杂度是O(n^1.3)~O(n^2),空间复杂度是O(1). 代码如下: /** * 源码名称: ShellSort.java * 日期:2014-08-11 * 程序功能:希尔排序 * 版权:[email protected] * 作者:A2BGeek */ public class ShellSort { public void shellSort(int[] in) { int length = in.length; int span = length / 2; int i

排序算法之希尔排序

文章转载自http://www.cnblogs.com/chengxiao/ 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组

经典排序算法之希尔排序

? 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.希尔排序适合数据量中等情况,几十个到几万个. ? 网上看了好久才彻底明白希尔排序是什么,简单的说将就是按照步进对数据进行分组,对每组分别进行插入排序,直到步进是1的时候则全部完成.在此感谢 dreamcatcher-cx的博客 的讲解. function sortShell(arr)

python数据结构与算法 33 希尔排序

希尔排序 希尔排序,有时称为递减增量排序,是在插入排序基础上,把列表拆成几个较小的子表,然后对每个子表使用插入排序的方法.选出子表的方法是希尔排序的关键,它并不是把列表的中相近的元素取出来组成子表,而是使用了一个增量值I,有时也叫做"间隙",然后每隔一个间隙选中一个元素来组成子表. 这可以从图6中看出来,列表中有9个元素,如果我们使用增量3,就有3个子表,每个子表单独做插入排序.完成之后的列表如图7,现在看这个表虽然没有完全排序,但对子表排序后,元素已经很接近它们的最终位置. 图6 增

算法学习之排序算法:希尔排序

希尔排序又称"缩小增量排序",它的基本思想是:先将整个待排记录序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对记录进行一次直接插入排序. 希尔排序的一个特点是:子序列的构成不是简单地"逐段分割",而是将相隔某个"增量"的记录组成一个子序列.这就使得希尔排序中关键字较小的记录不是一步一步地往前挪动,而是一次按照"增量"的大小跳跃式地往前移,从而使得在进行最后一趟增量为1的插入排

我的Java开发学习之旅------&gt;Java经典排序算法之希尔排序

一.希尔排序(Shell Sort) 希尔排序(Shell Sort)是一种插入排序算法,因D.L.Shell于1959年提出而得名.Shell排序又称作缩小增量排序. 二.希尔排序的基本思想 希尔排序的中心思想就是:将数据进行分组,然后对每一组数据进行排序,在每一组数据都有序之后 ,就可以对所有的分组利用插入排序进行最后一次排序.这样可以显著减少交换的次数,以达到加快排序速度的目的.       希尔排序的中心思想:先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组.所有距离

排序算法系列——希尔排序

希尔排序同之前介绍的直接插入排序一起属于插入排序的一种.希尔排序算法是按其设计者希尔(Donald Shell)的名字命名,该算法由1959年公布,是插入排序的一种更高效的改进版本.它的作法不是每次一个元素挨一个元素的比较.而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置:然后增量缩小:最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率.希尔排序对增量序列的选择没有严格规定. 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作

在路上---学习篇(一)Python 数据结构和算法 (4) --希尔排序、归并排序

独白: 希尔排序是经过优化的插入排序算法,之前所学的排序在空间上都是使用列表本身.而归并排序是利用增加新的空间,来换取时间复杂度的减少.这俩者理念完全不一样,注定造成的所消耗的时间不同以及空间上的不同. 归并排序涉及到递归的使用,需要理解其中精髓才能更好了解归并排序,以及其他应用到递归的算法.理解其本质才能更好的应用. 希尔排序 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本.希尔排序是非稳定排序算法.该方法因DL.Shell于195

研磨数据结构与算法-08希尔排序

希尔排序: /* * 希尔排序 */ public class ShellSort { /** * 排序方法 */ public static void sort(long[] arr) { //初始化一个间隔 int h = 1; //计算最大间隔 while(h < arr.length / 3) { h = h * 3 + 1; } while(h > 0) { //进行插入排序 long tmp = 0; for(int i = h; i < arr.length; i++) {