news 2026/3/11 19:08:32

知识点总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
知识点总结

1.插入排序

原理解释

举个简单的例子:

将10插入到已排序的数组arr中,保证数组元素从小到大排序

int arr[10]={3,7,8,9,12,15}; int key=10; for(int i=6-1;i>=0&&arr[i]>key;i--){ arr[i+1]=arr[i]; } arr[i]=key;

将数组arr从后往前,从大到小遍历,i为索引

如果key<arr[i],那么将该索引对应的元素后移:arr[i+1]=arr[i],此时arr[i]为空,索引前移(i--)

不断循环该步骤,直到i<0(说明需要插到第一位arr[0])或者直到arr[i]<=key,插入的位置就能找出,为索引i处,离开循环把key赋值给arr[i]

对乱序数组用插入排序

比如初始数组3 1 8 5 2 6 4

第一次循环:num[0]为有序,将num[1]赋值给key,根据上述方法将key插入有序数组中

1 3 8 5 2 6 4

第二次循环:num[0]、num[1]为有序,将num[2]赋值给key,根据上述方法将key插入有序数组中

1 3 8 5 2 6 4

第三次循环:num[0]、num[1]、num[2]为有序,将num[3]赋值给key,根据上述方法将key插入有序数组中

1 3 5 8 2 6 4

第四次循环:num[0]、num[1]、num[2]、num[3]为有序,将num[5]赋值给key,根据上述方法将key插入有序数组中

1 2 3 5 8 6 4

以此类推

可知第0次循环,第一个元素有序;第n-1次循环,n个元素都有序,故循环n-1次

代码实现

for(int i=1;i<n;i++){ //n为数组元素个数 int j; int key=num[i]; for(j=i-1;j>=0&&key<num[j];j--){ //j为索引 num[j+1]=num[j]; } num[j+1]=key; }

2.不用任何字符串函数去除字符串里特定的字符

#include <stdio.h> #include <stdlib.h> int main() { char s[100]="ashifoa46278sdhaj"; int k=0; for(int i=0;s[i]!='\0';i++){ if(s[i]>='0'&&s[i]<='9'){ s[k++]=s[i]; } } s[k]='\0'; puts(s); return 0; }

3.快速幂

概念引入

思考一个问题:7的10次方,怎样算比较快?

方法1:最朴素的想法,7*7=49,49*7=343,... 一步一步算,共进行了9次乘法。

这样算无疑太慢了,尤其对计算机的CPU而言,每次运算只乘上一个个位数,无疑太屈才了。这时我们想到,也许可以拆分问题。

方法2:先算7的5次方,即7*7*7*7*7,再算它的平方,共进行了5次乘法。

但这并不是最优解,因为对于“7的5次方”,我们仍然可以拆分问题。

方法3:先算7*7得49,则7的5次方为49*49*7,再算它的平方,共进行了4次乘法。

模仿这样的过程,我们得到一个在 O(log⁡n) 时间内计算出幂的算法,也就是快速幂

递归快速幂

思路

代码实现

#include <stdio.h> int qpow(int a, int n) { if (n == 0) return 1; else if (n % 2 == 1) return qpow(a, n - 1) * a; else { int temp = qpow(a, n / 2); return temp * temp; } } int main() { int a,n; scanf("%d %d",&a,&n); printf("%d",qpow(a,n)); return 0; }

注意,函数中的temp变量是必要的,因为如果不把a^(2/n)记录下来,直接写成qpow(a, n /2)*qpow(a, n /2),那会计算两次a^(2/n),整个算法就退化为了 O(n)

非递归快速幂

在此之前我解释二个符号&(按位与)以及>>(位运算符)

n & 1按位与

  • 类型:位运算符
  • 作用:判断n最低位是否为 1,即判断n是奇数还是偶数。
  • 返回值:整数(0 或 1)

>>:右移位运算符

属于位运算符的一种它用于将一个整数的二进制表示向右移动指定的位数

result = value >> n;
  • value:要被右移的整数(必须是整型:int,long,char等)
  • n:右移的位数(非负整数)
  • result:右移后的结果

1010>>=1,则1010变为了101

代码实现:

int qpow(int a,int n){ int res=1; while(n){ if(n&1){ res*=a; } n>>=1; a*=a; } return res; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/11 22:14:51

【强化学习】第二章:老虎机问题、ε-greedy算法、指数移动平均

【强化学习】第二章&#xff1a;老虎机问题、ε-greedy算法、指数移动平均一、从老虎机问题->强化学习算法1、老虎机问题上图是一组多台老虎机&#xff0c;每台老虎机的特点都各不相同&#xff0c;就是有的机器赢得多&#xff0c;有的机器输得多。但是每台老虎机的特点是固定…

作者头像 李华
网站建设 2026/3/11 20:33:42

Oracle数据库内存管理实操指南:PGA与SGA优化实战

Oracle数据库的内存管理直接决定了实例运行稳定性与性能上限&#xff0c;核心围绕程序全局区&#xff08;PGA&#xff09;和系统全局区&#xff08;SGA&#xff09;的分配、调整与监控展开。 一、PGA管理&#xff1a;进程私有内存的优化核心 1. PGA核心组成与关键概念 PGA是服务…

作者头像 李华
网站建设 2026/3/11 3:01:54

基于web的酒品商城购物系统的设计与实现-计算机毕业设计源码31522

摘要 随着电子商务的迅速发展&#xff0c;酒品市场也逐渐进入线上交易的时代&#xff0c;消费者对于酒品购物的需求不断增加。传统酒品销售模式存在着信息不透明、购买体验差等问题&#xff0c;因此开发一个基于Web的酒品商城购物系统&#xff0c;能够为消费者提供便捷、安全、…

作者头像 李华