Python学习-----Day06

冒泡排序

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

基本原理:

每一趟只能确定将一个数归位。即第一趟只能确定将末位上的数归位,第二趟只能将倒数第 2 位上的数归位,依次类推下去。如果有 n 个数进行排序,只需将 n-1 个数归位,也就是要进行 n-1 趟操作。

而 "每一趟 " 都需要从第一位开始进行相邻的两个数的比较,将较大的数放后面,比较完毕之后向后挪一位继续比较下面两个相邻的两个数大小关系,重复此步骤,直到最后一个还没归位的数。

def bubbleSort(arr):
    n = len(arr)
 
    # 遍历所有数组元素
    for i in range(n):
        for j in range(0, n-i-1):
 
            if arr[j] > arr[j+1] :
                arr[j], arr[j+1] = arr[j+1], arr[j]
 
arr = [64, 34, 25, 12, 22, 11, 90]
 
bubbleSort(arr)
 
print ("排序后的数组:")
for i in range(len(arr)):
    print ("%d" %arr[i]),
 
运行结果:
排序后的数组:
11
12
22
25
34
64
90

选择排序

选择排序(Selection sort)是一种简单直观的排序算法。选择排序首先从待排序列表中找到最小(大)的元素,存放到元素列表的起始位置(与起始位置进行交换),作为已排序序列,第一轮排序完成。然后,继续从未排序序列中找到最小(大)的元素,存放到已排序序列的末尾。直到所有元素都存放到了已排序序列中,列表排序完成。选择排序每次都是去找最小(大)的元素,隐含了一种挑选的过程,所以被称为选择排序。

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

A = [64, 25, 12, 22, 11] 
  
for i in range(len(A)): 
      
   
    min_idx = i 
    for j in range(i+1, len(A)): 
        if A[min_idx] > A[j]: 
            min_idx = j 
                
    A[i], A[min_idx] = A[min_idx], A[i] 
  
print ("排序后的数组:") 
for i in range(len(A)): 
    print("%d" %A[i])
 
运行结果
排序后的数组:
11
12
22
25
64

插入排序

插入排序(InsertionSort),一般也被称为直接插入排序。

对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

def insert_sort(tg_list):
	''' 排序算法:插入排序 '''
    for i in range(1,len(tg_list)):
        for j in range(i,0,-1):
            if tg_list[j] < tg_list[j-1]:
                tg_list[j-1], tg_list[j] = tg_list[j], tg_list[j-1]
            else:
                break
list_ = [8, 5, 1, 1, 8, 5, 7, 4, 6, 3]
insert_sort(list_)

二分查找

二分查找算法,也称为折半查找,是一种基于分治思想的搜索算法。它的基本原理是将有序数组分为两部分,并与目标元素进行比较,从而确定目标元素可能存在的区间。接着,根据比较结果,继续在较小或较大的那个区间内进行二分查找,直到找到目标元素或确定目标元素不存在。这种分而治之的策略使得二分查找算法的时间复杂度为 O(logN),在大规模数据集上具有高效性能。

nums = [1,2,33,44,66,77,567]
 
a = 1    
       
left = 0                # 最小数下标  
right = len(nums)-1     # 最大数下标
 
while left <= right:
    mid = int((left + right)/2)
    guess = nums[mid]
    if guess == a:
        print(mid)
        break
    elif guess > a:
        right = mid -1
    else:
        left = mid + 1
相关推荐
幼儿园老大*1 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
为什么这亚子1 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
1 小时前
开源竞争-数据驱动成长-11/05-大专生的思考
人工智能·笔记·学习·算法·机器学习
ctrey_1 小时前
2024-11-4 学习人工智能的Day21 openCV(3)
人工智能·opencv·学习
~yY…s<#>1 小时前
【刷题17】最小栈、栈的压入弹出、逆波兰表达式
c语言·数据结构·c++·算法·leetcode
啦啦右一1 小时前
前端 | MYTED单篇TED词汇学习功能优化
前端·学习
霍格沃兹测试开发学社测试人社区2 小时前
软件测试学习笔记丨Flask操作数据库-数据库和表的管理
软件测试·笔记·测试开发·学习·flask
今天我又学废了2 小时前
Scala学习记录,List
学习
幸运超级加倍~2 小时前
软件设计师-上午题-16 算法(4-5分)
笔记·算法
yannan201903132 小时前
【算法】(Python)动态规划
python·算法·动态规划