C# 冒泡排序、二分法查找

一、斐波拉契序列 数组

// 斐波斐波拉契序列核心算法
private int CalcFibonacci(int numSeqNo)
{
    if (numSeqNo == 0)
        return 1;
    if (numSeqNo == 1)
        return CalcFibonacci(numSeqNo - 1);
    return CalcFibonacci(numSeqNo - 2) + CalcFibonacci(numSeqNo - 1);
}
 
// 获取斐波拉契序列数组
private List<int> GetFibonacci()
{
    int numCount = Convert.ToInt32(this.TFibonacciCount.Text);
    List<int> objList = new List<int>();
 
    for (int i = 0; i < numCount; i++)
    {
        objList.Add(CalcFibonacci(i));
    }
 
    // 打乱数组顺序
    int numIndex = 0;
    Hashtable objHash = new Hashtable();
    List<int> objResult = new List<int>();
    Random objRandom = new Random();
    for (int i = 0; i < objList.Count(); i++)
    {
        numIndex = objRandom.Next(0, objList.Count());
        if (objHash.ContainsKey(numIndex))
        {
            i--;
            continue;
        }
        objHash.Add(numIndex, "");
        objResult.Add(objList[numIndex]);
    }
 
    return objResult;
}

二、冒泡排序

// 排序类型
enum OrderType
{
    None,
    Asc,
    Desc
}
 
// 冒泡排序
private void OrderList(ref List<int> objSource, OrderType objType = OrderType.Asc)
{
    /*
     * 不采用第三方变量更改变量值
     * a = 3
     * b = 5
     *
     * b = a + b  => 3 + 5
     * a = b - a  => 8 - 3
     * b = b - a  => 8 - 5
     *
     * */
 
    for (int i = 0; i < objSource.Count(); i++)
    {
        for (int j = i + 1; j < objSource.Count(); j++)
        {
            // 降序
            if (objType == OrderType.Desc)
            {
                if (objSource[j] > objSource[i])
                {
                    objSource[j] = objSource[j] + objSource[i];
                    objSource[i] = objSource[j] - objSource[i];
                    objSource[j] = objSource[j] - objSource[i];
                }
            }
            // 升序
            else if (objType == OrderType.Asc)
            {
                if (objSource[j] < objSource[i])
                {
                    objSource[j] = objSource[j] + objSource[i];
                    objSource[i] = objSource[j] - objSource[i];
                    objSource[j] = objSource[j] - objSource[i];
                }
            }
        }
    }
}

三、二分法查找

// 二分法查找
private int SearchItem(List<int> objSource, int numSearch, int numStart, int numEnd, OrderType objType = OrderType.Desc)
{
    // 获取中间索引
    int numMiddleIndex = (numStart + numEnd) / 2;
 
    // 判断区间是否合理
    if (numStart > numEnd)
    {
        return -1;
    }
    else
    {
        // 判断中间数是否是目标值
        if (objSource[numMiddleIndex] == numSearch)
        {
            return numMiddleIndex;
        }
        else
        {
            // 判断中间数是否大于目标值
            if (objSource[numMiddleIndex] > numSearch)
            {
                if (objType == OrderType.Desc)
                    return SearchItem(objSource, numSearch, numStart + 1, numEnd, objType);
                else
                    return SearchItem(objSource, numSearch, numStart, numEnd - 1, objType);
            }
            else
            {
                if (objType == OrderType.Desc)
                    return SearchItem(objSource, numSearch, numStart, numEnd - 1, objType);
                else
                    return SearchItem(objSource, numSearch, numStart + 1, numEnd, objType);
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值