插入排序与希尔排序--C语言实现

来源:互联网 发布:零点壹网络 编辑:程序博客网 时间:2024/06/14 11:01
/* insert sort and shell sort
 * nizqsut@163.com
 */

#include
#include

#include "fatal.h"

typedef int element_type;

/* 插入排序
 * 进行第N趟排序时,第N-1趟已经排好序了
 */
static void
insert_sort( element_type a[], int n )
{
    int j, p;
    element_type tmp;
    
    for ( p = 1; p < n; p++ ){
        tmp = a[p];
        for ( j = p; (j > 0) && (a[j - 1] > tmp); j-- ){
            a[j] = a[j - 1];
        } 
        a[j] = tmp;
    }
}

/* 希尔排序 */
static void
shell_sort( element_type a[], int n )
{
    int p, j, increment;
    element_type tmp;

    /* 使用shell增量 */
    for ( increment = n / 2; increment > 0; increment /= 2 ){
        /* 对每个增量使用插入排序 */
        for ( p = increment; p < n; p++ ){
            tmp = a[ p ];
            /*for ( j = p; (j >= increment) && ( a[ j - increment] > tmp );
                j -= increment ){
                a[ j ] = a[j - increment];
            }*/
            for ( j = p; j >= increment; j -= increment )
                if ( a[ j - increment] > tmp )
                    a[ j ] = a[j - increment];
                else
                    break;
            a[ j ] = tmp;
        }
    }
}

/************    The next is test functions    ***************/
//#define get_array_size(array)    ( sizeof(array) / sizeof(array[0]) )

#define D_COUNT    (0x10000)

/* equal return 1, else return 0 */
static int
my_memcmp( element_type *mem1, element_type *mem2, int count )
{

    int i;

    for ( i = 0; i < count; i++ )
        if ( *mem1++ != *mem2++ )
            return 0;

    return 1;
}

void
test_sort( void )
{
    int i;
    element_type *data4insert,*data4shell;

    data4insert = malloc( D_COUNT * sizeof(element_type) );
    data4shell = malloc( D_COUNT * sizeof(element_type) );
    if ( !data4insert || !data4shell )
        Error("Out of space!");

    for ( i = 0; i < D_COUNT; i++ ){
        /* rand()是个“伪”随机数函数*/
        data4shell[i] = data4insert[i] = rand();
        //data4shell[i] = rand();
    }

    /* 通过观测执行时间可以明显看出这两个排序算法时间性能相差甚远 */
    insert_sort( data4insert, D_COUNT );
    shell_sort( data4shell, D_COUNT );

    i = my_memcmp( data4insert, data4shell, D_COUNT );
    if ( i )
        printf("\t------ sort result equal. ------\n");
    else
        printf("\t------ sort result not equal. ------\n");
    free( data4insert );
    free( data4shell );
   
    return;
}
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(578) | 评论(0) | 转发(0) |
0

上一篇:u-boot启动代码分析一

下一篇:再读《TCP/IP详解 卷一:协议》

相关热门文章
  • QEMU源码分析系列(二)
  • 环形缓冲区的C语言实现...
  • 传播最广的一篇SVM算法博文...
  • C语言中的可变参数函数 三个点...
  • 16道嵌入式C语言面试题(经典)...
  • test123
  • 编写安全代码——小心有符号数...
  • 使用openssl api进行加密解密...
  • 一段自己打印自己的c程序...
  • sql relay的c++接口
  • linux dhcp peizhi roc
  • 关于Unix文件的软链接
  • 求教这个命令什么意思,我是新...
  • sed -e "/grep/d" 是什么意思...
  • 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
原创粉丝点击