正文

二路插入排序 2006-08-20 12:05:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/manbuyuduan/17706.html

分享到:

#include <stdio.h>
#include <stddef.h>

#define ARR_SIZE 10

/* 函数原型 */
void bidir_insert( int keys[], int temp[], const size_t i );

int main(void)
{
    size_t i;
    int keys[ARR_SIZE] = { 1050, 100, 150, 20, 9000, 5110, 3008, 1450, 5220, 500 };
    int temp[ARR_SIZE];  /* 辅助数组 */
    
    /* 进行二路插入排序 */
    bidir_insert(keys, temp, ARR_SIZE);
    /* 输出排序结果 */
    for ( i = 0; i < ARR_SIZE; ++i ) {
        printf("%d ", keys[i]);
    }
    
    printf("\nPress ENTER to quit...\n");
    getchar();
    return 0;
}

/* Begin of bidir_insert 05-11-12 12:00 */
void bidir_insert( int keys[], int temp[], const size_t arr_size )
{
     size_t i, first, final = first = 0;
     
     temp[0] = keys[0]; /* 将第一个元素放入辅助数组 */
     /* 利用辅助数组 temp 进行二路插入排序 */
     for ( i = 1; i < arr_size; ++i ) {
         if ( temp[final] <= keys[i] ) {             
             temp[++final] = keys[i];
         } else if ( keys[i] <= temp[first] ) {
             first = (first - 1 + arr_size) % arr_size;
             temp[first] = keys[i];
         } else {
             size_t index;
             
             for ( index = (final - 1 + arr_size) % arr_size; ;
                   index = (index - 1 + arr_size) % arr_size ) {
                 if ( temp[index] <= keys[i] ) {
                     size_t mid = final++;
                     /* 元素后移 */
                     while ( mid != index ) {
                         temp[(mid + 1) % arr_size] = temp[mid];
                         mid = (mid - 1 + arr_size) % arr_size;
                     }
                     temp[(index + 1) % arr_size] = keys[i];
                     
                     break;
                 }
             }
         }
     }
     
     /* 将 temp 的内容按顺序复制到 keys 中 */
     for ( i = 0; i < arr_size; ++i ) {
         keys[i] = temp[first];
         first = (first + 1) % arr_size;
     }
}  /* End of bidir_insert */

阅读(6496) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册