C,C++,C#对两个长度相同数组进行排序方法(希尔排序)

当遇到有数组需要进行排序的时候,除了冒泡排序,已经字典数组常规排序以外,还有以下希尔排序方法,做一下记录,方便以后再用;

/// <summary>
/// 希尔排序函数,升序
/// </summary>
/// <param name="r"></param>
/// <param name="t"></param>
/// <param name="length"></param>
private void shelltmp_fAsc(float[] r, float[] t, int length)
{
    float x, y;
    int d, i, j;
    d = length / 2;                                             /*取第一个步长值*/
    while (d >= 1)                                             /*步长d>=1,对每组进行直接插入排序*/
    {
        for (i = d; i < length; i++)                               /*对每组进行直接插入排序*/
        {
            x = r[i];                                         /*记录r[i]暂存入x中*/
            y = t[i];
            j = i - d;                                          /*确定每组中的记录r[i]前一个位置*/
            while (j >= 0 && x < r[j])                          /*在组中查找插入位置,较小数往前移*/
            {
                r[j + d] = r[j];                                /*记录后移*/
                t[j + d] = t[j];
                j = j - d;                                      /*记录位置前移一个步长*/
            }
            r[j + d] = x;                                       /*插入记录*/
            t[j + d] = y;
        }
        d = d / 2;                                              /*缩小步长值*/
    }

}

/// <summary>
/// 希尔排序函数,降序
/// </summary>
/// <param name="r"></param>
/// <param name="t"></param>
/// <param name="length"></param>
private void shelltmp_fDesc(float[] r, float[] t, int length)
{
    float x, y;
    int d, i, j;
    d = length / 2;                                             /*取第一个步长值*/
    while (d >= 1)                                             /*步长d>=1,对每组进行直接插入排序*/
    {
        for (i = d; i < length; i++)                               /*对每组进行直接插入排序*/
        {
            x = r[i];                                         /*记录r[i]暂存入x中*/
            y = t[i];
            j = i - d;                                        /*确定每组中的记录r[i]前一个位置*/
            while (j >= 0 && x > r[j])                        /*在组中查找插入位置,较大数往前移*/
            {
                r[j + d] = r[j];                              /*记录后移*/
                t[j + d] = t[j];
                j = j - d;                                    /*记录位置前移一个步长*/
            }
            r[j + d] = x;                                     /*插入记录*/
            t[j + d] = y;
        }
        d = d / 2;                                             /*缩小步长值*/
    }
}

调用调用

float[] r = new float[5] { 3.1f, 2.5f, 0.4f, 1.6f, 0.1f };
float[] t = new float[5] { 3.1f, 2.5f, 0.4f, 1.6f, 0.1f };
shelltmp_fAsc(r, t, 5);
shelltmp_fDesc(r, t, 5);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值