算法学习与笔记(一) 引言

本文介绍了算法的基本概念,包括特性、分析及设计。通过Python代码展示了如何找到三个数中的最小值和中间值,并提供了两种不同的解决方案。此外,还探讨了用伪代码表述算法的方法,包括if语句、while循环和for循环,并给出了一系列数组操作的伪代码示例,如找最小值、最大值、次大值等。
摘要由CSDN通过智能技术生成

一.算法

算法是一步一步解决某种问题的方法

1.1算法

算法的特性:输入,输出,精确性,确定性,有穷性,正确性,通用性

算法研究的任务:设计解决一个特定问题的算法,以及对一个给定的算法进行分析

算法分析:正确性,终止性,时间分析,空间分析

1.1习题:

此处主要是对思路考察,所以代码我先用python实现一下效果,易懂

1.写一个算法,在a,b,c中找出最小的那个

(1)x=a

  (2)若 b<x,x=b.

  (3)若 c<x,   x=c.

if a < b and a < c:  
  print("最小值为:", a)
elif b < c:    
  print("最小值为:", b)
else:   
  print("最小值为:", c)

2。写一个算法,在三个不同的值a,b,c中找出中间的那个

思路一,将三个数相加,分别减去最大值和最小值

(1)x=a

(2)若b>x,则x=b

(3)若c>x,则 x=c

(4)y=a

(5)若b<y,则y=b

(6)若c<y,则y=c

(7)w=a+b+c,middle=0

(8)middle=w-x-y

def find_middle(a, b, c):   
    max_num = max(a, b, c)   
    min_num = min(a, b, c)    
    return a + b + c - max_num - min_num
# 测试print(find_middle(1, 2, 3)) 
   # print(find_middle(5, 9, 3))
   # print(find_middle(8, 6, 7))  

思路二,将三个数从小到大排序,放到数组里,取中间值

(1)创建一个长度为3的数组 x[]=[a,b,c]

(2)若x[1]<x[0],swap x[1],x[0]

(3)若 x[2]< x[1],swap x[2],x[1]

(4)若x[2]<x[0],swap  x[2],x[0]

(5)middle =x[1]

num1 = int(input("请输入第一个数:"))
num2 = int(input("请输入第二个数:"))
num3 = int(input("请输入第三个数:"))
# 将三个数从小到大排序
arr = [num1, num2, num3]
arr.sort()
# 取中间值
median = arr[1]
print("中间值为:", median)

3.将两个十进制正整数相加的标准方法写成一个算法(我有点问题)

  1. 从个位开始,依次将两个数对应位的数字相加,得到当前位的和以及进位;
  2. 将当前位的和 mod 10 作为该位的结果;
  3. 将当前位的进位加到下一位的计算中;
  4. 重复1~3步骤,直到两个数的所有位都处理完毕;
  5. 如果最高位的进位不为0,则将其加到结果的最高位。
num1=int(input("请输入一个整数"))
num2=int(input("请输入另一个整数"))
def add_two_numbers(num1,num2):
    result=[]
    carry=0
    i,j=len(str(num1))-1,len(str(num2))-1
    num1_list =list(str(num1))
    num1_int_list=[int(x) for x in num1_list]
    num2_list =list(str(num2))
    num2_int_list=[int(x) for x in num2_list]
    while i>=0 or j>=0:
        sum = carry
        if i >= 0:
            sum +=num1_int_list[i]
            i -= 1
        if j >= 0:
            sum += num2_int_list[j]
            j -= 1
        result.append(str(sum % 10))
        carry = sum // 10
    if carry != 0:
        result.append(str(carry))
    return ''.join(result[::-1])
print(add_two_numbers(num1,num2))

1.2表述算法的伪代码

伪代码:应该包括标题,简要说明,输入和输出参数,函数部分(第一行为函数名,里面是函数的参数,参数表示函数用的数据,变量,数组等,被函数执行的语句由大括号括起)

(1)if 语句  条件为真,执行动作,//表示注释

if(condition)

        action1 //符合条件执行action1

     else

        action2

(2) return  语句 //结束一个函数,并把x的值返回给函数调用者

(3)while循环 

          while(condition)

                action

1.2.2伪代码练习

1.用while循环写一个算法,回送数组S[1],s[2],....s[n]的最小值

Input Parameter:s
Output Parameters:None

array_min_verl(s){
    small=s[1]
    i=2
    while(i<=s.last){
        if(s[i]<small)//找到最小值
            small=s[i]
        i+=1

    }
    return small



}

2.使用for循环写一个算法,回送数组S[1],s[2],....s[n]的最小值

Input Parameter: s
Output Parameter: None

array_min_ver2(s){
    small=s[1]
    for i =2 to s.last
        if (s[i]<small)//找到较小的值
            small=s[i]
    return small

}

3.写一个算法,输出数组S[1],s[2],...s[n]的最大值与次大值。假定n>1,且数组中各元素的值豆不相同

Input parameter:s
Output parameter:None


array_maxandTheNextLargestValue_vel3(s){
    if(s[1]>s[2])
        max=s[1]
        TheNextLargestValue=S[2]
    else
        max=s[2]
        TheNextLargestValue=S[1]
    for i=3 to s.last
        if(s[i]>max)
            TheNextLargestValue=max
            max=s[i]
        else(TheNextLargestValue<s[i]<max)
            TheNextLargestValue=s[i]
    return max,TheNextLargestValue
            
  
}

4.写一个算法,输出数组S[1],s[2],...s[n]中最小值与次小值。假定n>1,且数组中各元素的值都不相同

Input parameter:s
Output parameter:None


array_minandTheNextSmallestValue_vel4(s){
    if(s[1]<s[2])
        min=s[1]
        TheNextSmallestValue=S[2]
    else
        min=s[2]
        TheNextSmallestValue=S[1]
    for i=3 to s.last
        if(s[i]<min)
            TheNextSmallestValue=min
            min=s[i]
        else(TheNextSmallestValue>s[i]>min)
            TheNextSmallestValue=s[i]
    return min,TheNextSmallestValue
            
  
}

5,写一个算法,输出数组S[1],S[2],...S[n]中最小值和最大值

Input parameter:s
Output parameter:None


array_minandmax_vel5(s){
    if(s[1]<s[2])
        min=s[1]
        max=S[2]
    else
        min=s[2]
        max=S[1]
    for i=3 to s.last
        if(s[i]<min)
            min=s[i]
        else(s[i]>max)
            max=s[i]
    return min,max
            
  
}

6,写一个算法,回送出数组S[1],S[2],...S[n]中首次出现的最大元素的下标

这个我没看懂题意,先留个坑 

首次出现的最大元素,应该就是拿第一个元素去做对比,直到出现一个比第一个元素大的元素,然后记录其下标

Input Parameter :S
Output parameters: None

find_first_largest(s){
    index = 1  //记录当前最大元素的下标 index
    for i =2 to s.last
        if(s[i]>=s[index])
            index=i  //更新
            break
    return index
}

7.写一个算法,回送出数组S[1],S[2],...S[n]中末次出现的最大元素的下标

这个好像要用到哈希表,我也没理解题意。先留个坑,以后学到了来补

我多想了

Input Parameter :S
Output parameters: None

find_last_largest(s){
    index = 1  #记录当前最大元素的下标 index
    for i =2 to s.last
        if(s[i]>=s[index])
            index=i  //更新
    return index
}

8.写一个算法,回送数组s[1],s[2]...s[n]中首次出现值key的下标,如果数组中没有这个值,就返回0

Input parameter :s
Output parameter:None

key=anynumber
find_key_value(s){
    index=0
    for i =1 to s.last
        if(s[i]=key)
            index=i
            break
    return index

}

9.写一个算法,回送数组s[1],s[2]...s[n]中末次出现值key的下标,如果数组中没有这个值,就返回0

Input parameter :s
Output parameter:None

key=anynumber
find_key_value(s){
    index=0
    for i =1 to s.last
        if(s[i]=key)
            index=i
    return index

}

10.写一个算法,回送数组s[1],s[2]...s[n]中首次出现小于前一项的那个项的下标,如果n=1,或者对所有i,s[i]<=s[i+1],则回送值0

Input parameter :s
Output parameter:None

find_out_of_order(s){
    index=1
    n=len(s)
    if n = 1
        return index=0
    else
       for i=2 to s.last{
           if (s[i]<s[index])
                index=i
           else
                index=0
       return index
  }
}

我写的答案太笨拙了

Input parameter :s
Output parameter:None


find_out_of_order(s){
   for i=2 to s.last
        if (s[i]<s[i-1])
            return i
        return 0

}

11.写一个算法,将数组s[1],s[2],...,s[n]倒置

12.写一个算法,输入数组s[1],s[2]...s[n]和一个值x(假定所有的值都是实数),设n>1,该数组对所有i满足s[i]<=s[i+1].该算法将x插入数组,使得对所有i任然满足s[i]<=s[i+1]

13.写一个算法,输入一个二进制位的数组s[1],s[2],...,s[n],该算法重新安排该数组,让所有0都在1前面

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值