2-路插入排序

C语言实现
可以认为使用的数组是环路数组(这也是为什么移动final_num和first_num要加n取余的原因)

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int n = 8;
    int num[8] = { 49,38,65,97,76,13,27,49 };        // 待排序数组
    int temp[8] = { 0 };                             // 辅助数组
    int final_num = 0;                               // 尾指针(非真实指针,只代表数组下标)
    int first_num = 0;                               // 头指针(同上,且开始均指向0)

    temp[0] = num[0];                                // 先确定第一个位置,并以此为判断依据
    for (int i = 1; i < n; ++i)                      // 从第二个数开始插入排序
    {
        if (temp[final_num] < num[i])                // 如果待插数字比尾部数字还大,则插在尾部 
                                                     // 数字后面,并把尾部指针向后移动一位
        {
            final_num = (final_num + 1 + n) % n;
            temp[final_num] = num[i];
        }
        else if (temp[first_num] > num[i])           // 如果待插数字比头部数字还小,则插在头部
                                                     // 数字后面,并把头部指针向前移动一位
        {
            first_num = (first_num - 1 + n) % n;
            temp[first_num] = num[i];
        }
        else if (temp[0] <= num[i])                  // 如果比头部数字大,比尾部数字小
                                                     // 则比较该数字是否比辅助数组的第一个数大
                                                     // 如果大的话,从final_num往前找,找到
                                                     // 位置后插进去,否则与上述步骤相反
        {
            int k = (final_num + 1 + n) % n;
            while (temp[((k - 1) + n) % n] > num[i])
            {
                temp[(k + n) % n] = temp[(k - 1 + n) % n];
                k = (k - 1 + n) % n;
            }
            temp[(k + n) % n] = num[i];
            final_num = (final_num + 1 + n) % n;
        }
        else
        {
            int k = (first_num - 1 + n) % n;
            while (temp[((k + 1) + n) % n] < num[i])
            {
                temp[(k + n) % n] = temp[(k + 1 + n) % n];
                k = (k + 1 + n) % n;
            }
            temp[(k + n) % n] = num[i];
            first_num = (first_num - 1 + n) % n;
        }
        for (int i = 0; i < n; ++i)                  // 每次排序都输出辅助数组序列
        {
            printf("%d\t", temp[i]);
        }
        printf("\n");
        printf("first=%d final=%d\n", first_num, final_num);
    }
    for (int i = 0; i < n; ++i)                      // 根据辅助数组确定新序列
    {
        num[i] = temp[(first_num + i) % n];
        printf("%d\t", num[i]);
    }
    return 0;
}

运行结果
这里写图片描述

参考
http://www.jb51.net/article/70975.htm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值