Python 基本算法实现(一)

1、顺序查找

查找算法是程序中经常用到的算法。如果要从n个元素中查找 x 是否存在,最原始的方法是从头到尾挨个查找,这种查找的方法叫顺序查找方法。

优点:不需要内容有序,一个一个查找。

缺点:查找效率低,不适合大数据 ,假设数据的总个数为n,则计算复杂度为n/2

顺序查找有三种情形发生:第一项就是要查找的数据对象,只需一次查找即可完成,也是最理想的情况;最差的情况,需要 n 次比较,全部比较完之后找不到数据。平均情况下,比较次数为 n/2 次。算法的时间复杂度是 O(n) .

def sequest(List,target):
    pose = 0 #初始查找位置
    while pose < len(List):
        if List[pose] == target:#找到数据对象
            return target #返回目标数据 并终止循环 ..return执行后,函数终止
        else:  
            pose = pose + 1
    return False #没找到数据对象
testlist=[1,3,5,6,7,8,9,23,44,]
print(sequest(testlist,11))

如果在列表中查找最大、最小值,就把列表中的第一个元素假设定为最大值,最小值

def Max_data(List):
    pose = 0 #初始位置
    imax = List[0] #假设第一个元素为最大值
    while pose < len(List):#循环条件
        if List[pose]>imax: #若列表中的当前值大于假设最大值
            imax = List[pose]#则把当前值赋予给最大值

        else:
            pose += 1
    return imax #返回最大值
test=[2,4,1,6,7,3,9,10,32,11,67]
Max_data(test)

def Min_data(List):
    pose = 0 #初始位置
    imin = List[0] #假设第一个元素为最小值
    while pose < len(List):#循环条件
        if List[pose]<imin: #若列表中的当前值小于假设最小值
            imin = List[pose]#则把当前值赋予给最小值

        else:
            pose += 1
    return imin #返回最小值
test=[2,4,1,6,7,3,9,10,32,11,67,1]
Min_data(test)

2、折半查找

搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半、

折半查找法是效率较高的一种查找方法。假设有已经按照从小到大的顺序排列好的五个整数A0~A4,要查找的数是X,其基本思想是: 设查找数据的范围下限为l=0,上限为h=4,求中点m=(l+h)/2,用X与中点元素Am比较,若X等于Am,即找到,停止查找;否则,若X大于Am,替换下限l=m+1,到下半段继续查找;若X小于Am,换上限h=m-1,到上半段继续查找;如此重复前面的过程直到找到或者l>h为止。如果l>h,说明没有此数,打印找不到信息,程序结束。

def binary(List,key,left,right):#List目标列表,key目标数据,left列表索引左下标,right列表索引右下标 
    List.sort() #对列表进行升序排序
    if left > right:#查找失败
        return -1
    mid = (left + right)//2
    if List[mid] < key:
        left = mid+1

        return binary(List,key,left,right)#再次调用函数
    elif List[mid] > key:
        right = mid -1

        return binary(List,key,left,right)
    else:
        return mid
value = [3,9,10,12,25,34,45,56,67,76,84,99]
result = binary(value,25,0,len(value)-1)
if result == -1:
    print('查找失败')
else:
    print('查找成功,对应下标为',result)

3、冒泡排序

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

def BubbleSort(las):
    n = len(las) 
    for i in range(n): #遍历所有数组元素
        for j in range(0,n-i-1):
            if las[j] > las[j+1]:#进行元素比较
                las[j],las[j+1] = las[j+1],las[j]
                print(las)#打印每一次排序结果

las = [43,12,56,34,78,98]
BubbleSort(las)
print('排序后的数组:')
for i in range(len(las)):
    print('%d'%las[i])

4、选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的表进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。

def SelectionSort(lis):          
    count = len(lis)
    for i in range(count):#主要用列表索引来完成排列
        Min_data = i #把列表第一个值假定为最小值
        for j in range(i+1,count):  #开始从列表的第二个元素比较
            if lis[Min_data] > lis[j]:#如果列表的第一个假定的值大于列表的第二个元素的值,就互换位置
                Min_data = j

        lis[i],lis[Min_data] = lis[Min_data],lis[i]
    print(lis)
a = [5,4,9,2,1,0]
SelectionSort(a)

 

发布了15 篇原创文章 · 获赞 7 · 访问量 899

猜你喜欢

转载自blog.csdn.net/qq_42432935/article/details/103339235