冒泡排序
   

冒泡排序(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
10-15 23:34