希尔排序算法的C语言实现示例_C 语言

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位

希尔排序通过将比较的全部元素分为几个区域来提升插入排序的性能。这样可以让一个元素可以一次性地朝最终位置前进一大步。然后算法再取越来越小的步长进行排序,算法的最后一步就是普通的插入排序,但是到了这步,需排序的数据几乎是已排好的了(此时插入排序较快)。

假设有一个很小的数据在一个已按升序排好序的数组的末端。如果用复杂度为O(n2)的排序(冒泡排序或插入排序),可能会进行n次的比较和交换才能将该数据移至正确位置。而希尔排序会用较大的步长移动数据,所以小数据只需进行少数比较和交换即可到正确位置。

一个更好理解的希尔排序实现:将数组列在一个表中并对列排序(用插入排序)。重复这过程,不过每次用更长的列来进行。最后整个表就只有一列了。将数组转换至表是为了更好地理解这算法,算法本身仅仅对原数组进行排序(通过增加索引的步长,例如是用i += step_size而不是i++)。

C语言实现示例

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define LEN 10

typedef int dataType;

//初始化数组,赋值整数随机数
void initArr(dataType arr[], int len);
//希尔排序
void shellSort(dataType arr[], int len);
//交换两个数
void swap(dataType &x,dataType &y);
//打印数组元素
void print(dataType arr[], int len);

int main()
{
 dataType arr[LEN];
 initArr(arr,LEN);
 printf("================希尔排序================");
 //输出排序前的数组元素
 printf("\n排序前数组元素:");
 print(arr,LEN);
 shellSort(arr,LEN);
 printf("\n排序后数组元素:");
 print(arr,LEN);
 printf("\n");
 return 0;
}

//初始化数组,赋值整数随机数
void initArr(dataType arr[], int len)
{
 int i = 0;
 srand((unsigned)time(NULL));
 for(i = 0; i < len; i++)
 arr[i] = rand();
}
//希尔排序
void shellSort(dataType arr[], int len)
{
 int h = 0;
 int i = 0;
 int j = 0;
 //设置步长
 for(h = 1; h < len; h = 3 * h + 1)
 ;
 while(h)
 {
 h /= 3;
 if(h < 1)
  break;
 for(i = h; i < len; i++)
  for(j = i; j >= h; j-=h)
  {
  if(arr[j-h] < arr[j])
   break;
  swap(arr[j-h],arr[j]);
  }
 }
}

//交换两个数
void swap(dataType &x,dataType &y)
{
 dataType temp;
 temp = x;
 x = y;
 y = temp;
}

//打印数组元素
void print(dataType arr[], int len)
{
 int i = 0;
 for(i = 0; i< LEN; i++)
 {
 if(i % 5 == 0)
 {
  printf("\n");
 }
 printf("%d\t",arr[i]);
 }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c语言
, 排序
希尔排序
希尔排序算法c语言、希尔排序c语言代码、希尔排序c语言、c语言单链表希尔排序、希尔排序算法,以便于您获取更多的相关知识。

时间: 2024-08-29 04:40:25

希尔排序算法的C语言实现示例_C 语言的相关文章

详解Bucket Sort桶排序算法及C++代码实现示例_C 语言

桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里.每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序).桶排序是鸽巢排序的一种归纳结果.当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n)).但桶排序并不是比较排序,他不受到O(n log n)下限的影响. 桶排序以下列程序进行: 1.设置一个定量的数组当作空桶子. 2.寻访序列,并且把项目一个一个放到对应的桶子去. 3.对每个不是空的桶子进行排

C语言 选择排序算法详解及实现代码_C 语言

选择排序是排序算法的一种,这里以从小到大排序为例进行讲解. 基本思想及举例说明 选择排序(从小到大)的基本思想是,首先,选出最小的数,放在第一个位置:然后,选出第二小的数,放在第二个位置:以此类推,直到所有的数从小到大排序. 在实现上,我们通常是先确定第i小的数所在的位置,然后,将其与第i个数进行交换. 下面,以对 3  2  4  1 进行选择排序说明排序过程,使用min_index 记录当前最小的数所在的位置. 第1轮 排序过程 (寻找第1小的数所在的位置) 3  2  4  1(最初, m

深入解析Radix Sort基数排序算法思想及C语言实现示例_C 语言

基本思想: 将待排数据中的每组关键字依次进行桶分配. 具体示例: 278.109.063.930.589.184.505.269.008.083 我们将每个数值的个位,十位,百位分成三个关键字: 278 -> k1(个位)=8,k2(十位)=7,k3=(百位)=2. 然后从最低位个位开始(从最次关键字开始),对所有数据的k1关键字进行桶分配(因为,每个数字都是 0-9的,因此桶大小为10),再依次输出桶中的数据得到下面的序列. 930.063.083.184.505.278.008.109.58

C语言 奇偶排序算法详解及实例代码_C 语言

C语言奇偶排序算法 奇偶排序,或奇偶换位排序,或砖排序,是一种相对简单的排序算法,最初发明用于有本地互连的并行计算.这是与冒泡排序特点类似的一种比较排序.该算法中,通过比较数组中相邻的(奇-偶)位置数字对,如果该奇偶对是错误的顺序(第一个大于第二个),则交换.下一步重复该操作,但针对所有的(偶-奇)位置数字对.如此交替进行下去. 使用奇偶排序法对一列随机数字进行排序的过程 处理器数组的排序 在并行计算排序中,每个处理器对应处理一个值,并仅有与左右邻居的本地互连.所有处理器可同时与邻居进行比较.交

使用Java实现希尔排序算法的简单示例_java

简介希尔排序(缩小增量法) 属于插入类排序,由Shell提出,希尔排序对直接插入排序进行了简单的改进:它通过加大插入排序中元素之间的间隔,并在这些有间隔的元素中进行插入排序,从而使数据项大跨度地移动,当这些数据项排过一趟序之后,希尔排序算法减小数据项的间隔再进行排序,依次进行下去,进行这些排序时的数据项之间的间隔被称为增量,习惯上用字母h来表示这个增量. 常用的h序列由Knuth提出,该序列从1开始,通过如下公式产生: h = 3 * h +1 反过来程序需要反向计算h序列,应该使用 h=(h-

桶排序算法的理解及C语言版代码示例_C 语言

理解:桶排序是计数排序的变种,把计数排序中相邻的m个"小桶"放到一个"大桶"中,在分完桶后,对每个桶进行排序(一般用快排),然后合并成最后的结果.基本思想:桶排序假设序列由一个随机过程产生,该过程将元素均匀而独立地分布在区间[0,1)上.我们把区间[0,1)划分成n个相同大小的子区间,称为桶.将n个记录分布到各个桶中去.如果有多于一个记录分到同一个桶中,需要进行桶内排序.最后依次把各个桶中的记录列出来记得到有序序列.效率分析:桶排序的平均时间复杂度为线性的O(N+C

细致解读希尔排序算法与相关的Java代码实现_java

希尔排序(Shell's sort)是一种非常"神奇"的排序算法.说它"神奇",是因为没有任何人能清楚地说明它的性能到底能到什么情况.希尔排序因DL.Shell于1959年提出而得名.自从C. A. R. Hoare在1962年提出快速排序后,由于其更为简单,一般采用快速排序.但是,不少数学家们还是孜孜不倦地寻找希尔排序的最佳复杂度.作为普通程序员,我们可以学习下希尔的思路. 顺便说一句,在希尔排序出现之前,计算机界普遍存在"排序算法不可能突破O(n2)&

python实现的希尔排序算法实例

  本文实例讲述了python实现希尔排序算法的方法.分享给大家供大家参考.具体如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 def shellSort(items): inc = len(items) / 2 while inc: for i in xrange(len(items)): j = i temp = items[i] while j >= inc and items[j-inc] > temp: items[j] = items[j - inc]

java中实现希尔排序算法

package Utils.Sort; /**   *希尔排序,要求待排序的数组必须实现Comparable接口   */   public class ShellSort implements SortStrategy   {   private int[] increment; /**   *利用希尔排序算法对数组obj进行排序   */   public void sort(Comparable[] obj)   {   if (obj == null)   {   throw new N