Python第一章.续.补

本文介绍了插值查找、斐波那契查找、不同类型的排序算法如冒泡排序、选择排序、插入排序、希尔排序、快速排序、堆排序、归并排序以及非比较排序算法如计数排序、基数排序和桶排序。详细讲解了这些算法的工作原理和示例应用。
摘要由CSDN通过智能技术生成

插值查找

数据必须是有序的,除了要考虑位置还得考虑元素的分布情况

"""
插值查找适用于数据分布比较均匀的情况
low 区间最小值角标
high 区间最大值角标
mid 区间中间值角标
mid = (key- arr[low]) / (arr[high] - arr[low]) * (high - low) + low
"""
arr = [ 1 , 12 , 24 , 31 , 32 , 36 , 42 , 45 , 51 , 52 , 65 , 72 , 99 ]
low = 0
high = len ( arr ) - 1
mid = 0
key = 31
while True :
        mid = int (( key - arr [ low ]) / ( arr [ high ] - arr [ low ]) * ( high - low )) + low
        if mid > high or mid < low :
                mid = - 1
                break
        if arr [ mid ] == key :
                break
        elif arr [ mid ] < key :
                low = mid + 1
        else :
                high = mid - 1
print ( mid )

斐波那契查找

斐波那契查找原理与二分查找相似,仅仅改变了中间结点(mid)的位置,mid不再是中间或插值得到,而是位于黄金分割点附近

​​​​​​​查找算法---(图解)斐波那契查找-CSDN博客

排序算法

冒泡排序

两两比较,左大右小就交换,第一轮就找出最大值

arr = [ 6 , 2 , 1 , 3 , 5 , 7 , 4 , 8 , 9 ]
for i in range ( len ( arr ) - 1 ): # -1 少比较 1
        for j in range ( len ( arr ) - i - 1 ):
                if arr [ j ] > arr [ j + 1 ]:
                        arr [ j ], arr [ j + 1 ] = arr [ j + 1 ], arr [ j ]
print ( arr )
选择排序
arr = [ 6 , 2 , 1 , 3 , 5 , 7 , 4 , 8 , 9 ]
        for i in range ( len ( arr ) - 1 ): # -1 少比较 1
                for j in range ( i + 1 , len ( arr )):
                        if arr [ i ] > arr [ j ]:
                                arr [ i ], arr [ j ] = arr [ j ], arr [ i ]
print ( arr )
插入排序

arr = [ 6 , 2 , 1 , 3 , 5 , 7 , 4 , 8 , 9 ]
"""
for i in range(1, len(arr)):
        j = i
        while j > 0 and arr[j - 1] > arr[j]:
                arr[j], arr[j - 1] = arr[j - 1], arr[j]
                j -= 1
"""
# 优化后的插入排序
for i in range ( 1 , len ( arr )):
        e = arr [ i ]
        j = i
        while j > 0 and arr [ j - 1 ] > e :
                arr [ j ] = arr [ j - 1 ]
                j -= 1
        arr [ j ] = e
print ( arr )
希尔排序*

直接插入排序的优化

希尔排序是将数据分组,将每一组进行插入排序。
每一组排成有序后,最后整体就变有序了。

 public static void shellSort(int[] array2) {
     int gap = array2.length;//为数组的长度 - 为10
     while (gap > 1) {
         gap /= 2;//先是分成了5组,然后是2组,再是1组
         shell(array2, gap);//调用直接插入排序方法
     }
 }

 //实现直接插入排序方法
 public static void shell(int[] array2, int gap) {
     //i下标从第一组的第二个数据开始
     for (int i = gap; i < array2.length ; i++) {
         int tmp = array2[i];//tmp存放i下标的值
         int j = i - gap;//j下标为i-gap个位置
         //j每次-gap个位置
         for (; j >= 0; j-=gap) {
              if (array2[j] > tmp) {
                //j下标的值大,将j下标的值放到j变量加上一个gap的位置上
                array2[j + gap] = array2[j];
              }else {
                 //j下标的值较小,j下标的值要直接放到j变量加上一个gap的位置上
                 break;
              }
          }
          //此时j下标的值是负数了,将tmp的值放到j变量加上一个gap的位置上
          array2[j + gap] = tmp;
      }
 }

排序算法 —— 希尔排序(图文超详细)-CSDN博客

快速排序*

快速排序(Quick sort)是对冒泡排序的一种改进

def swap(arr, i, j):
    arr[i], arr[j] = arr[j], arr[i]
 
def partition(arr, left, right):
    pivot = left
    index = pivot+1
    i = index
    while i<=right:
        if arr[i]<arr[pivot]:
            swap(arr, i, index)
            index+=1
        i+=1
    swap(arr, pivot, index-1)
    return index-1
 
def quickSort(arr, left=None, right=None):
    left = 0 if not isinstance(left, (int, float)) else left
    right = len(arr)-1 if not isinstance(right, (int, float)) else right
 
    if left < right:
        partitionIndex = partition(arr, left, right)
        quickSort(arr, left, partitionIndex-1)
        quickSort(arr, partitionIndex+1, right)
    return arr
排序——快速排序(Quick sort)-CSDN博客
堆排序*

堆的结构可以分为大根堆和小根堆,是一个完全二叉树,而堆排序是根据堆的这种数据结构设计的一种排序,下面先来看看什么是大根堆和小根堆

堆排序算法(图解详细流程)_堆排序的详细过程-CSDN博客

归并排序*

是用分治策略(分治法)实现对n个元素进行排序的一种高速的、稳定的排序算法

数据结构和算法:归并排序(合并排序)详解_合并排序是采用分治策略实现对n个元素进行排序的算法,是分治法的一个典型应用和完-CSDN博客

计数排序
arr = [ 8 , 2 , 1 , 4 , 8 , 7 , 9 , 2 , 3 , 4 ]
minValue = min ( arr )
maxValue = max ( arr )
temp = [ 0 ] * ( maxValue - minValue + 1 )
for i in range ( len ( arr )):
        temp [ arr [ i ] - minValue ] += 1
k = 0
for index in range ( len ( temp )):
        while temp [ index ] > 0 :
                arr [ k ] = index + minValue
                k += 1
                temp [ index ] -= 1
print ( arr )
基数排序*

排序算法是一种非比较算法,其原理是将整数按每个位数分别比较。它利用了桶的思想。

排序算法之基数排序_基数排序算法-CSDN博客

桶排序*

桶排序,也叫作箱排序,是一个排序算法,也是所有排序算法中最快、最简单的排序算法。

排序算法 | 桶排序算法原理及实现和优化_桶排序改进-CSDN博客

列表对象函数

对象函数是区别于内置函数的,内置函数直接调用即可len()max()

对象函数 必须通过某一个具体的对象来调用 列表.函数名()

append()

讲某一个元素对象添加在列表的表尾

如果添加的是其他的序列,该序列也会被看成是一个数据对象

arr = [1,2,3,4]
arr.append(5)
print(arr)
arr2 =
[6,7,8]这是一个对象
arr.append (arr2)
print(arr)

count()

统计列表中 某一个元素出现的次数

arr = [1,2,3,4, 1, 2, 3, 1, 1, 2, 0, 0, 1]
print(arr.count(1))

expend()

在当前列表中 将传入的其他序列的元素添加在表尾

arr1 = [1,2,3]
arr2 = [4,5,6]
arr1.extend(arr2)
print(arr1)

arr1.extend(7)
TypeError: 'int' object is not iterable(可迭代的=序列)

arr1.extend("ABC")
print(arr1)

index()

查找(从左到右)元素第一次出现的位置(角标)

arr = [1,2,3,4, 5, 6, 7, 4, 5, 6, 9]
print(arr.index(4))
print(arr.index(4, 5,8))#[5,8)区间中找4的角标

print(arr.index(10))
ValueError: 10 is not in list 找不到则报错

insert(index,obj)

在某一个角标出处插入一个元素

arr = [1,2,3,4]
arr.insert(2, 5)
print(arr)

pop()

弹栈:删除最后一个元素 并返回其值

也可以删除指定角标处的元素

arr = [1,2,3,4]
print(arr.pop())
print(arr)
print(arr.pop(1))删除角标1对应的元素
print(arr)

remove()

移除指定元素 从左到右第一次出现的

arr = [1,2, 3, 4, 2, 3, 4, 2, 3, 4]
arr.remove(4)
print(arr)

reverse()

翻转列表

arr = [1,2,3,4]
arr.reverse()
print(arr)

sort()

排序
arr = [4,2, 5, 2, 6, 2, 7, 9, 4, 7, 2, 7]
arr.sort() 
print(arr)

arr = [4,2, 5, 2, 6, 2, 7, 9,4, 7, 2,7]
# arr.sort()# 默认升序
arr.sort(reverse=Truel) # 降序

arr=["ABC","123123123","我爱你中国","123123123","kasdkjas"]
arr.sort(key= len)#以序列的长度为基准进行排序
print(arr)

clear()

清空
arr = [1,2,3,4]
arr.clear()
print(arr)

copy()

复制一个列表(浅拷贝)

arr1 = [1,2,3,4]
arr2 = arr1.copy()
print(arr1 == arr2) # True 比较的是内容
print(arr1 is arr2) # False 比较的是对象地址
print(arr1)
print(arr2)
arr1[0] = 5
print(arr2[0])

# 上述代码在arr1中修改元素 并不影响arr2
arr1 = [1,2,3, [4,5,6]]
arr2 = arr1.copy()
arr2[0] = 7
print(arr1[0])
print(arr2[0])
arr2[3][0] = 666
print(arr1[3])
# 上述代码在arr2中修改元素 影响arr1

arr2[3] = [9,9,9]
print(arr1[3])
print(arr2[3])

# 额外的知识
# del关键字:删除
arr = [1,2,3,4]
del arr[0]
#删除序列中的元素
print(arr)
del arr
# 删除变量

NameError: name 'arr' is not defined. Did you mean: 'arr2'?
print(arr)

字符串对象函数

可变对象与不可变对象

列表是可变对象:可以修改列表中的元素 甚至长度

字符串是不可变对象:不可以修改字符串中的元素 包括长度

注意:也就意味着对字符串的修改一律不是在本身修改 而是创建一个新的字符串!

>>> arr = [1,2,3]
>>> arr[0] = 4
>>> arr
[4, 2, 3]
>>> S = "ABC"
>>> s[0]
'A'

>>>
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
字符串对象不支持元素修改

center()

制定填充字符 将目标字符进行居中

s1 = "ABC"
s2 = s1. center(10, "#")
print(s1)
print(s2)

count ()

和列表的count相似 统计字符串的个数

s = "abchjghjabcjkhjkhabchkjhabc"
print(s. count( "abc") }
print(s.count("a"))
# count是非贪心统计 贪心统计6个
S = "AAAAAAAA"
print(s.count("AAA") )

print(s.count("AAA",2,6))

endswith()

过滤字符串结尾 同样也可以指定区间
s="泷泽萝拉.avi"
print(s.endswith(".avi"))

find()

寻找字符串第一次出现的位置 同样也可以指定区间

s=“八百标兵奔北坡”
print(s.find("标兵"))        #2 指定是标的角标

format()

格式化输出

name =“小强”
age = 18
print(“我的名字叫%s,年龄%d岁”%(name,age))
print(“我的名字叫{},年龄{}岁".format(name,age))
print(f"我的名字叫{name},年龄{age}岁")
print(f"我的名字叫{3>2},年龄{2**8}岁")

index()
寻找字符串第一次出现的位置 同样也可以指定区间
s = "八百标兵奔北坡"
print(s.index("标兵")) # 2 指定是标的角标
s = "ABC"
print(s.find("D")) # -1 如果找不到 则返回-1
# print(s.index("D"))# 如果找不到 直接报错 ValueError: substring not found
isalnum()

判断是否是字母或数字字符串 al-alpha 字母 num-number 数字

print("abc".isalnum())
print("123".isalnum())
print("abc123".isalnum())
print("abc123^&%&^&".isalnum())

# isalpha()是否是纯字母字符串
# isdecimal()是否是十进制纯数字字符串
# isdigit()是否是纯数字字符串
# isspace()是否是纯空格字符串

# islower()出现的字母是否是小写字母
print("123abc".islower())
print("123Abc".islower())

# isupper()出现的字母是否是大写字母

# join()将字符串列表进行拼接的
arr = ["banana", "orange", "apple","pich"]
s = "-". join(arr)

print(s)

# ljust()左对齐 rjust()右对齐
print("ABC".ljust(10, "#"))
print("ABC".rjust(10, "#"))

# lower()出现的大写字母转小写 upper()相反
print("Hello World123". lower())

# lstrp()去除左边空格 rstrip()去除右边空格

print("   ABC    ". lstrip())

print("   ABC    ". rstrip())

print("   ABC    ".strip())#两边都去掉连续空格

print("   A   B   C    ".strip())

# replace(a,b)替换 al日 b新
s="宇智波佐助、宇智波斑、宇智波鼬、宇智波泉奈、宇智波止水、宇智波卡卡西"
s1=s.replace("宇智波",“千手”)
print(s)
print(s1)

# split() 以某一个分割符来切割字符串 结果是一个字符串的列表
s ="泰罗-杰克-赛文-迪迦-梦比优斯”
arr = s.split("-")
print(arr)
arr = "1 2 34 4.12".split(" ")
print(arr)

math模块 

python math模块详解_math在python中是什么意思-CSDN博客

random模块

Python标准库中的random函数,可以生成随机浮点数、整数、字符串,甚至帮助你随机选择列表序列中的一个元素,打乱一组数据等。

Python中random(随机)模块详解_random模块中的sample函数实现原理-CSDN博客

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值