希尔排序(shellsort)算法实现

简介:
 希尔排序(shellsort)又叫增量递减(diminishing increment)排序,是由D.L. Shell发明的,这个算法是通过一个逐渐减小的增量使一个数组逐渐趋近于有序从而达到排序的目的。

      假设有一个数组int data[16] = {...}。 首先将这个增量设为16 / 2 = 8,这样就将这个数组分成了8个子数组,它们的索引是0, 8    1, 9   2, 10等等 。对这些子数组进行排序。然后再使增量为8 / 2 = 4,这样就将原数组分成了4个子数组,它们的索引分别是0, 4, 8, 12    1, 5, 9, 13等等。再对这四组数进行排序,直到增量为1。
     以上所描述的增量递减只是一种方法,这种方法并不是最有效率的。如f(n) = 3 * f(n - 1) + 1  f(1) = 1   (..., 121, 40, 13,  4, 1)就比上面的取增量的方法好。这种方法的时间复杂度是 O(n ^1.5)

算法如下 

#include  < stdio.h >

void  output_array( int  data[],  int  n)
{
    
int  i;
    
for (i  =   0 ; i  <  n; i ++ )
        printf(
" %d  " , data[i]);
    printf(
" \n " );
}
void  swap( int   * a,  int   * b)
{
    
int  x;
    x 
=   * a;
    
* =   * b;
    
* =  x;
}
void  insertion_sort( int  data[],  int  n,  int  increment)
{
    
int  i, j;
    
for (i  =  increment; i  <  n; i  +=  increment)
        
for (j  =  i; j  >=  increment  &&  data[j]  >  data[j  -  increment]; j  -=  increment)
            swap(
& data[j],  & data[j  -  increment]);
}
void  shellsort( int  data[],  int  n)
{
    
int  i, j;
    
for (i  =  n  /   2 ; i  >   2 ; i  /=   2 )
        
for (j  =   0 ; j  <  i; j ++ )
            insertion_sort(data 
+  j, n  -  j, i);
    insertion_sort(data, n, 
1 );
}
int  main()
{
    
int  data[]  =  { 5 3 1 665 77 66 44 11 10 9 8 6 };
    output_array(data, 
12 );
    shellsort(data, 
12 );
    output_array(data, 
12 );
    
return   0 ;
}





 本文转自 androidguy 51CTO博客,原文链接: http://blog.51cto.com/androidguy/215348 ,如需转载请自行联系原作者
相关文章
|
6月前
|
算法 搜索推荐 C++
基本算法-希尔排序
基本算法-希尔排序
|
2月前
|
机器学习/深度学习 搜索推荐 测试技术
希尔排序算法
希尔排序算法
27 0
|
7月前
|
搜索推荐 C#
C#希尔排序算法
C#希尔排序算法
|
8月前
|
存储 搜索推荐 C#
C#插入排序算法
C#插入排序算法
|
9月前
|
算法 搜索推荐
算法-希尔排序详解
算法-希尔排序详解
|
10月前
|
算法 搜索推荐 Shell
希尔排序的算法实现
希尔排序的算法实现
72 0
|
11月前
|
算法
堆排序(算法实现)
堆排序-算法实现 前面介绍了堆的基本功能实现(https://blog.csdn.net/m0_46343224/article/details/127986662),了解了堆,这里用堆实现排序
53 0
堆排序(算法实现)
|
算法 搜索推荐
【算法】希尔排序算法
希尔排序是一种基于插入排序而改进的一种排序算法。插入排序对于近乎有序的序列,排序效率非常高,可以达到线性排序的效率。但对于其他的情况,每次只能移动一位的插入排序效率是非常低的,基于次产生了希尔排序。
75 0
【算法】希尔排序算法
|
算法 搜索推荐
【算法】插入排序算法
插入排序是一种简单直观并且稳定的排序,虽然插入排序的时间复杂度为O(n^2),但是在一个几乎有序的序列中插入一个数,要求插入后此数据序列仍然有序,这时候插入算法便具有很大的优势。
62 0
|
机器学习/深度学习 搜索推荐 算法
【算法】冒泡排序算法
冒泡排序是一种计算机科学领域的较简单的排序算法,时间复杂度是O(n*n),虽然运行效率较慢,但实现简单,适用于小数据的排序。冒泡排序要重复的走访要排序的序列,一次比较相邻的两个元素,如果顺序错误就交换两者顺序,通过不断的交换来排序。
64 0
【算法】冒泡排序算法