基于408考研基本算法与部分知识点

408常见算法

1.1交换排序

1.1.1冒泡排序

冒泡排序算法的时间复杂度:O(n2),空间复杂度O(1),时间最好复杂度O(n)
算法基本思路:设有n个数字,从后往前找,如果前一个比后一个大,则交换位置,第一轮交换长度-2次,此为内循环:
for(j=n-1(因为数组下标需要-1,所以从n-1开始);j>i;j–)
{swap(a[j-1],a[j])}
接下俩考虑外循环,i从0开始,循坏n-1次
for(i=0;i<n-1;i++)

1.1.2快速排序

基本思路:定义一个数组,将中间元素做为评判标准,将比中间值大的都放在右边,比中间值小的放在中间值左边
主要运用两个函数,一个函数是如何将第一个数与其他数比较,作为中间元素:基本代码如下:
int compare(int &arr,int low,int high)
{int mid_fact=arr[low];因为不知道中间元素具体是谁,我们不妨把数组第一个元素作为评判标准
while(low<high){
while(low<high&&arr[high]>mid_fact)
high–;将数组最后一个元素和该元素比较,如果比它大,则说明已经排好了,不需要动,则将下一个元素和mid_fact比较,所以high–
arr[low]=arr[high]若上面的表达式不满足,则说明该元素比mid_fact小,则将arr[low]覆盖(因为第一个元素已经在mid_fact保存了,所以
不用担心该元素没有)
while(low<high&&arr[low]<mid_fact)
low++;原理同上
arr[high]=arr[low]

}
arr[low]=mid_fact因为覆盖之后的元素并没有mid_fact,但是循环结束的条件是low<high,所以跳出循环后我们可以知道此时low的位置就是
中间元素,所以直接将mid_fact覆盖它即可
return low;

}
确定位置的函数写好后,我们此时开始quicksort函数的编写。具体代码如下:
void quicksort(int &arr,int low,int high)
{if(low<high)//因为只有low小于high时才会排序,此条件不符合说明已经排序好了
{ int private= compare(arr,low,high)首先确定中间元素
quicksort(arr,low,private-)排序左边元素
quicksort(arr,private+1,high)排序右边元素

}

}

2.1插入排序

2.1.1直接插入

插入排序的基本算法思路:如果只有一个元素,说明它本身就是有序的,所以不用排序,如果元素大于等于2,则要排序,我们不妨假设有一个十个数的数组
14 15 16 10 61 28 11 99 18 93
我们将99定为第一个数,则后面需要一个一个的插入进来,然后排序,我们需要有一个变量来存储插入的元素,我们设为insertval,为了更清晰理解,我们
直接将前三个排好序,然后后一个插入,此时14为第一个,当10插入的时候,首先将32赋给insertval,然后10与16比较,10小,则用16将10覆盖,15
和10比,15大,将15覆盖原来16的位置,14比10大,将14赋给原来15的位置,然后此时前面没有数据了,则将insertval的值覆盖着原来的14的位置,
此时就算一个数的插入排好了,不难看出,外层循环是数组长度,具体代码如下:
for(i=1;i<n;i++)//因为只有一个数默认有序,所以我们从第二个位置开始排序,也就是i=1的位置
{
int insertval=arr[i];
for(j=i-1;j>=0&&arr[j]>=insertval;j–){因为当后一个元素插入排序时,前面的元素已经是有序的,所以只有大于的情况,若所插入的元素大于循环中的
元素,说明已经排好了,直接将insertval的值赋给此时j+1的位置即可
arr[j+1]=arr[j];}
arr[j+1]=insertval
}

3.1折半查找

基本算法思路:首先定义一个数组,然后用一个sort函数,将数组和数组长度和需要查找的元素传入该函数,
然后在该函数里面定义一个low(数组第一个元素),high(数组最后一个元素),之后定义一个mid=(low+high)/2
该排序主要就是传入的数据和中间元素比,如果比中间元素大,则low=mid+1,向右一半查找,如果小于中间元素,则high=mid-1,
向左一半查找,一次类推,最后找到的情况一定是mid等于该元素,则返回mid,如果没有找到,则返回-1,基本代码如下:
interesting sort(int &arr,int len,int x)
{
int low,high,mid=(low+high)/2;
if(x>ST.elem[mid]){
low=mid+1;
}else if(x<ST.elem[mid]){
high=mid-1;
}else{
return mid;
}
return -1;
}

二叉树知识点

1.1前序遍历

前序遍历(先序遍历,也叫深度优先遍历):先打印自身,再打印左子树,最后打印右子树

2.1中序遍历

中序遍历:先打印左子树,在打印当前节点,再打印右子树

3.1后序遍历

后序遍历:先打印左子树,再打印右子树,最后打印该结点

4.1层次遍历

层次遍历(广度优先遍历):顺序打印

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小yuan在努力

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值