冒泡排序
冒泡排序(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