回首页 回首页 ◎ 设为首页  
◎ 收藏本站  
◎ 给我留言  
  
  首 页  C/C++教程  C++之父的FAQ  C/C++动向  C/C++源代码  C/C++误区  Unix/Linux  下载中心  乱七八糟  蚂蚁的Blog  
  当前位置:首 页 >> C/C++源代码 >> 数据结构与算法 C >> 二路插入排序
最 近 更 新
[转] 猴子吃桃问题的一..
通讯录程序源代码推荐
快速排序
二路插入排序
[经典算法 C] 高斯分布..推荐
[数据结构 C]赫夫曼编码推荐
线索二叉树
二叉树的基本操作
银行业务模拟推荐
杨辉三角推荐
最 新 推 荐
通讯录程序源代码推荐
[经典算法 C] 高斯分布..推荐
[数据结构 C]赫夫曼编码推荐
银行业务模拟推荐
杨辉三角推荐
迷宫求解推荐
括弧匹配检验推荐
单链表的实现及其操作推荐
顺序表及其操作推荐
二进制转换十进制(顺序..推荐
热 门 排 行
通讯录程序源代码推荐
迷宫求解推荐
杨辉三角推荐
快速排序
银行业务模拟推荐
[转] 猴子吃桃问题的一..
[经典算法 C] 高斯分布..推荐
[数据结构 C]赫夫曼编码推荐
十进制转换八进制
二进制转换十进制(顺序..推荐
站 内 搜 索

Web stdcpp.cn
关键词

搜索方式

搜索范围

精确匹配
广 告

二路插入排序


来源:蚂蚁的 C/C++ 标准编程 作者:antigloss 等级:一般
发布于2005-11-12 12:04 被读2516次 【字体:

/*
 * FileName:          bidir_insertion_sort.c
 * Author:            Antigloss at http://stdcpp.cn
 * LastModifiedDate:  2005-11-12 12:00
 * Purpose:           Bidirection Insertion Sort
 */

#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 */

本文版权归 蚂蚁的 C/C++ 标准编程 以及 作者 antigloss 共同所有,转载请注明原作者和出处。谢谢。



相关专题:暂无相关专题

上一篇:[经典算法 C] 高斯分布随机数源代码
下一篇:快速排序

共有评论 0 条 网友评分 1分 查看全部评论

查看全部评论

【发表评论】 评分:1分 2分 3分 4分 5分


验证码:

Powered By Www.Xydw.COM Ver1.14 管理
Copyright © 2005-2006 蚂蚁的 C/C++ 标准编程 All Right Reserved. XCMS
粤ICP备06014124号   站长:Antigloss