C++学习日志day19-----数据结构与算法

介绍4种排序算法和1种查找算法:
冒泡排序
先确定目的位置(比如说,最大的放在数组末尾),然后从另一端的第一个数开始,将相邻的两个数进行比较,交换。代码如下:

int bubble_sort(int *num,int size){
    int temp = 0;
    for(int i = 0;i < size - 1;i++)
        for(int j = 0;j < size - 1 -  i;j++){
            if(*(num + j) < *(num + j + 1)){
                temp = *(num + j + 1);
                *(num + j + 1) = *(num + j);
                *(num + j) = temp;
            }
        }
}

选择排序
先选择一个目标位置,然后从另一端的第一个数开始,和数字中的每一个数进行比较,交换,直到把合适的数放在合适的位置上。代码如下:

int choice_sort(int* p_num,int size){
    int temp = 0;
    for(int i = size - 1;i > 0;i--)
        for(int j = 0;j < i;j++){
            if(*(p_num + i) < *(p_num + j)){
                temp = *(p_num + i);
                *(p_num + i) = *(p_num + j);
                *(p_num + j) = temp;
            }
        }
}

插入排序
默认数组中第一个数据已经按照顺序(这里用从小到大举例)排列,用第二个数据和第一个数据比较小,就将第二个数据插入到第一个数据之前,完成换位动作之后,原本的第二个数据肯定是已经到达合适的位置,就不再往前比较。按照这样的规律将数据后续剩余的所有数据都依次插入。
代码如下:

int insert_sort(int* p_num,int size){
    int temp = 0;
    for(int i = 1;i < size;i++)
        for(int j = i - 1;j >= 0;j--)
        {
            if(*(p_num + j + 1) < *(p_num + j)){
                temp = *(p_num + j + 1);
                *(p_num + j + 1) = *(p_num + j);
                *(p_num + j) = temp;
            }
            else break;
        }
}

快速排序
这种排序方法最快,也是最难理解的。(以从小到大为例)
3,8,1,2,9,7,6,5 我们以5为目标数据,3是这一次比较的比较数据
3,8,1,2,9,7,6,5 3在5的左边且比5小,不换位,将8作为这次的比较数据
3,5,1,2,9,7,6,8 8在5的左边且比5大,换位,将6作为这次的比较数据
3,5,1,2,9,7,6,8 6在5的右边且比5大,不换位,将7作为这次的比较数据
3,5,1,2,9,7,6,8 7在5的右边且比5大,不换位,将9作为这次的比较数据
3,5,1,2,9,7,6,8 9在5的右边且比5大,不换位,将2作为这次的比较数据
3,2,1,5,9,7,6,8 2在5的右边且比5小,换位,将1作为这次的比较数据
3,2,1,5,9,7,6,8 1在5的左边且比5小,不换位,本轮换位结束。

可以发现一轮换位之后,5左边的数字都比5小,5右边的数字都比5大。
上述的操作是快速排序的最基本操作。
接下来,要对5左边的数字进行上述操作,然后对右边也进行这样的操作,最终会把所有的数据排列好。
所以快速排序,是由它基本的操作和递归函数组成的。
代码如下:

void quick_sort(int* p_num,int size){
    int base = *p_num;
    int* p_start = p_num;
    int* p_end = p_num + size - 1;
    int temp = 0;
    if(!(p_start < p_end))
        return ;
    while(p_start < p_end){
        if(*p_start > *p_end)
            ex(p_start,p_end);
        if(*p_start == base)
            p_end--;
        else
            p_start++;
    }
    quick_sort(p_num,p_start - p_num);
    quick_sort(p_end + 1,size - (p_end - p_num) - 1);
}

上述代码中,灵活的运用了指针。
原本,按照快速排序的思想,会选择一个数据来展开讨论,且有四种情况。
然而,代码中,从考虑目标数数据通过指针转变成了考虑位置。
只要前面的位置的数据大于后面数据的位置,就换位,然后再确定谁是目标数据,再将参与过排序的比较数据剔除。大大的简化了代码。目前说不上来是什么改进,总觉得是个很棒的思想。
折半查找
比起顺序查找,折半查找节省了一半的时间。
折半查找要求数组已经是有序的。
将要查找的目标数据和查找范围的中间值比较,然后缩小查找范围,最终找到数据。
代码如下:

void ex(int* first,int* secend){
    int temp = 0;
    temp = *secend;
    *secend = *first;
    *first = temp;
}
int* search(const int* p_num,int size,int value){
    const int* p_first = p_num;
    const int* p_last = p_num + size - 1;
    const int* p_mid = NULL;
    while(p_first <= p_last){                        //当两个指针没有交错的时候继续循环
        p_mid = p_first + (p_last - p_first + 1)/2; //中间指针用于查找数值,每次都要设置成查找范围的中间位置
        if(*p_mid < value){                         //如果目标值比当前的中间指针所指的数字要大,就把头指针移动到中间指针的后面的位置,来缩小范
围
            p_first = p_mid + 1;
        }
        else if(*p_mid > value){                    //如果目标值比当前的中间指针所知的数字要小,就把尾指针移动到中加你指针的前面的位置,缩小范
围
            p_last = p_mid - 1;
        }
        else{                                       //找到了就返回中间指针
            return (int*)p_mid;
        }
    }
    return NULL;                                    //找不到就返回空指针
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值