2023年第6周学习总结

(本周学习的主要是《啊哈算法》中1~3章:排序、栈、队列、链表、枚举)

快速排序

平均时间复杂度O(NlogN)。

  • 每次排序时设置一个基准值,将小于基准值的数放在左边,大于基准值的数放在右边。(基准值归位)。
  • 每次排序后得到分割点(归位后的基准值),数据从分割点处分成两个部分。
  • 从侧开始再次进行分割,待一侧彻底完成分割,再递归进行另一侧的分割。

例:对以下10个数进行排序

6        1        2        7        9        3        4        5        10        8

首先将设基准值为temp,temp=6。接下来将小于temp的值放在temp的左边,大于temp的值放在temp的右边。

3        1        2        5        4        6        9        7        10        8(第一次排序)

以上完成一次排序,也就是将基准值归位。下面是具体描述:

  1. 从右侧开始寻找小于temp的数a[j],然后从左侧开始寻找大于temp的数a[i]。两边成功找到,交换a[i]与a[j]。
  2. 若i<j,继续寻找、交换。直至i==j。
  3. 最后,交换temp与a[i]的值,成功将本次的基准值归位。

代码如下:

void quicksort(int left,int right){
    int i,j,t,temp;
    if(left >right)
    return;
    temp=a[left];
    i=left;
    j=right;
    while(i!=j)
    {
        //从右开始往左找小于temp的值
        while(a[j]>=temp&&i<j)
            j--;
        //再从左往右找大于temp的值
        while(a[i]<=temp&&i<j)
            i++;
        if(i<J)//当i与j未相遇
        {
            int t=a[i];
            a[i]=a[j];
            a[j]=a[i];
        }
    
    }
    //最后将基准值归位
    a[left]=a[i];
    a[i]=temp;
    quicksort(left,i-1);//递归,继续处理左半部分
    quicksort(i+1,right);//递归,继续处理右半部分
}

总结:


队列(先进先出 First In First Out)

  • 队列是一种特殊的线性结构,它只允许再队首(head)进行删除操作即“出队”,而在队列尾部(tail)进行插入操作即“入队”。
  • 当队列中没有元素时(head==tail)称该队列为空队列。
  • 常用链表表示。
  • 以下可以将三个基本元素封装为一个结构体类型,用来表示队列:
struct queue
{

    int data[200];//队列主体
    int head;//队首
    int tail;//队尾
}

栈(后进先出 Last In First Out)

  • 栈时具有一定操作约束的线性表,只能在一端进行插入和删除操作。
  • 插入即入栈(push),删除即出栈(pop),栈顶(top)。
  • 常用数组表示。
  1. 每入栈一次top随之+1,每出栈一次top随之-1。栈中没有元素时(top=0),称该堆栈为空栈。

枚举(穷举)

  • 有序的尝试每一种可能。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值