数据结构与算法(2)

目录

1 SequentialSearch(顺序查找)

2 BinarySearch(折半查找)

3 Recursion(递归)

4 折半查找的递归写法

5 Permutations(排列组合)

6 InsertionSort(插入排序)


1 SequentialSearch(顺序查找)

    对于没有排序的数据,只能运用顺序查找,速度很慢。

template<class T>
int SequentialSearch(T* list, const int len, const T a)
{
    for (int i = 0;i < len;i++)
    {
        if (list[i] == a)
            return i;
    }
    return -1;
}

2 BinarySearch(折半查找)

    对于已升序或降序的数据,折半查找可以快速的查找出目标数据,其主要原理为通过先查找最中间的数,若目标数据大于查找数据,则进一步查找大的那一半数据的中位数,以此类推,2^{20}(100万)数据只需要查找20次。

template<class T>
int BinarySearch(T* list, const int len, const T a)
{
    int low, high, mid;
    low = 0, high = len - 1;

    while (low <= high)
    {
        mid = (low + high) / 2;
        if (list[mid] == a)
            return mid;
        else if (list[mid] < a)
            low = mid + 1;
        else high = mid - 1;
    }
    return -1;
}

3 Recursion(递归)

    简单的说,递归就是自己调用自己。如计算阶乘时。

long Factorial(int n)
{
    if (0 == n)
        return 1;
    else
        return n * Factorial(n - 1);
}

    可以看出递归的缺点为速度慢,占用内存大;其优点为可读性强,好理解。

    以下为迭代:

long Factorial1(int n)
{
    long ret = 1;
    for (int i = n;i > 0;i--)
        ret = ret * i;
    return ret;
}

4 折半查找的递归写法

template<class T>
int BinarySearch(T* list, const int left, const int right, const T a)
{
    if (left <= right)
    {
        int mid = (left + right) / 2;
        if (a < list[mid])
            return BinarySearch(list, left, mid - 1, a);
        else if (a > list[mid])
            return BinarySearch(list, mid + 1, right, a);
        return mid;
    }
    return -1;
}

5 Permutations(排列组合)

    例如:abc    ->    abc    ->    abc

                                          ->    acb

                        ->    bac    ->    bac

                                         ->    bca

                        ->    cab    ->    cab

                                         ->    cba

void Permutations(char* p, const int k, const int m)
{
    if (k == m)
    {
        for (int i = 0;i <= m;i++)
            std::cout << p[i];
        std::cout << std::endl;
    }
    else
    {
        for (int i = k;i <= m;i++)
        {
            std::swap(p[k], p[i]);
            Permutations(p, k + 1, m);
            std::swap(p[k], p[i]);
        }
    }
}

    其中k为第一个字母下标,m为最后一个字母下标。

6 InsertionSort(插入排序)

        拿出一个数据,将其与之前拿出已排好序的数据作比较,插入正确的位置,直到所有数据均已拿出。

template<class T>
void InsertSort(T* list, const int len)
{
    int in, out;
    for (out = 1;out < len;++out)
    {
        T temp = list[out];
        in = out;
        while (in > 0 && list[in - 1] >= temp)
        {
            list[in] = list[in - 1];
            --in;
        }
        list[in] = temp;
    }
}

        低级排序中插入排序速度最快。到此低级排序算法共三个已经结束,详情参考我的上一篇文章。高级排序算法将会在下一篇文章开始。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值