python字符串选择排序轨迹_python算法学习第——第7天(二分查找、选择排序、快速排序)...

1、二分查找

对一串有序数字进行二分查找。

函数 binary_search 接受一个有序数组和一个元素。如果指定的元素包含在数组中,这个函数将返回其位置。你将跟踪要在其中查找的数组部分——开始时为整个数组

low = 0

high = len(list) - 1

8c023ad5c66b420c3149abbb84ae4829.png

你每次都检查中间的元素。

mid = (low + high) // 2 # 如果(low + high)不是偶数,python自动将mid向下取整

guss = list[mid]

如果猜的数字小了,就相应的修改low。

if guess < item:

low = mid + 1

如果猜的数字大了,就修改high。

if guess > item:

high = mid - 1

全部代码如下:

def binary_search(lst, item):

low = 0

high = len(lst) - 1

while low <= high:

mid = (low + high)//2 # 向下取整

guss = lst[mid]

if guss == item:

return mid

if guss > item:

high = mid - 1

else:

low = mid + 1

return None

# print("请输入一串有序数字,以空格分隔:",end="")

# my_list = [int(i) for i in input().split()]

my_list = [int(i) for i in input("请输入一串有序数字,以空格分隔:").split()] # 将上面两句合并

# my_list = [1,3,5,7,9]

a = int(input("请 输 入 要 二 分 查 找 的 数 字:"))

print(binary_search(my_list,a))

时间复杂度:O(logn)

2、选择排序

将一个无序的列表采用 选择排序 的方式进行从小到大进行排序。

代码如下:

# 找出最小元素的函数

def findSmallest(arr):

smallest = arr[0]

smallest_index = 0

for i in range(1,len(arr)):

if arr[i] < smallest:

smallest = arr[i]

smallest_index = i

return smallest_index

# 选择排序函数

def selectionSort(arr):

newArr = []

for i in range(len(arr)):

smallest = findSmallest(arr)

newArr.append(arr.pop(smallest))

return newArr

a = [int(i) for i in input().split()]

print(selectionSort(a))

时间复杂度:O(n^2)

3、快速排序

排序算法来说,最简单的数组什么样呢?就是根本不需要排序的数组。

4ef30079290dba28831e58b6c2c7cdd7.png

因此,基线条件为数组为空或只包含一个元素。在这种情况下,只需原样返回数组——根本就不用排序。

def quicksort(array):

if len(array) < 2:

return array

我们来看看更长的数组。对包含两个元素的数组进行排序也很容易。

f69e17c3158e7c0a0c2249d9e7ade8e7.png

包含三个元素的数组呢?

4c5b0f98743e9823e93f93e43d96b12a.png

这里可以使用 D&C (分而治之) 的思想。

下面介绍快速排序的工作原理。首先,从数组中选择一个元素,这个元素被称为基准值(pivot)。

我们暂时将数组的第一个元素用作基准值。

接下来,找出比基准值小的元素以及比基准值大的元素。

bbc0e2fb3bd29d16cba63f937a541864.png

这被称为分区(partitioning)。现在你有:

一个由所有小于基准值的数字组成的子数组

基准值

一个由所有大于基准值的数组组成的子数组

这里只是进行了分区,得到的两个子数组是无序的。但如果这两个数组是有序的,对整个数组进行排序将非常容易。

a277235f6bf6ed29cfd92a7dfee9a4aa.png

如果子数组是有序的,就可以像下面这样合并得到一个有序的数组:左边的数组 + 基准值 +右边的数组。在这里,就是[10, 15] + [33] + [],结果为有序数组[10, 15, 33]。

如何对子数组进行排序呢?对于包含两个元素的数组(左边的子数组)以及空数组(右边的子数组),快速排序知道如何将它们排序,因此只要对这两个子数组进行快速排序,再合并结果,就能得到一个有序数组!

quicksort([15, 10]) + [33] + quicksort([])

> [10, 15, 33]

不管将哪个元素用作基准值,这都管用。假设你将15用作基准值。

1f480274f4fe8420826874a39b078d25.png

这个子数组都只有一个元素,而你知道如何对这些数组进行排序。现在你就知道如何对包含三个元素的数组进行排序了,步骤如下。

(1) 选择基准值。

(2) 将数组分成两个子数组:小于基准值的元素和大于基准值的元素。

(3) 对这两个子数组进行快速排序。

包含四个元素的数组呢?

e6f422b58aaec6b4c1bdd2daf2d867c9.png

假设你也将33用作基准值。

3017e18f7687c42cbc42baa99c29611f.png

左边的子数组包含三个元素,而你知道如何对包含三个元素的数组进行排序:对其递归地调用快速排序。

38baf69fbee6e1939f61a2ddff1e33e9.png

因此你能够对包含四个元素的数组进行排序。如果能够对包含四个元素的数组进行排序,就能对包含五个元素的数组进行排序。为什么呢?假设有下面这样一个包含五个元素的数组。

75e718bdf57724d6bf66ccd2f204389c.png

根据选择的基准值,对这个数组进行分区的各种可能方式如下。

134b4975467872be1606eef9dea5cb51.png

注意,这些子数组包含的元素数都在0~4内,而你已经知道如何使用快速排序对包含0~4个元素的数组进行排序!因此,不管如何选择基准值,你都可对划分得到的两个子数组递归地进行快速排序。

例如,假设你将3用作基准值,可对得到的子数组进行快速排序。

128e59ebf2e5950adcc80314d1933559.png

将子数组排序后,将它们合并,得到一个有序数组。即便你将5用作基准值,这也可行。

067b51188f3090c24a19b7a3eefc2cc7.png

将任何元素用作基准值都可行,因此你能够对包含五个元素的数组进行排序。同理,你能够对包含六个元素的数组进行排序,以此类推。

代码:

def quicksort(array):

if len(array) < 2:

return array # 基线条件:为空或者只包含一个元素的数组是“有序”的

else:

pivot = array[0] # 选择基准值

less = [i for i in array[1:] if i <= pivot]#由所有小于或者等于基准值的元素组成的子数组

greater = [i for i in array[1:] if i > pivot]#由所有大于基准值的元素组成的子数组

return quicksort(less) + [pivot] + quicksort(greater)

print(quicksort([2, 7, 1, 3, 4, 8, 2]))

# print([1,2,3]+[4,5,6])

时间复杂度:平均情况下为 O(nlogn)

原文链接:https://blog.csdn.net/weixin_43624626/article/details/114098514

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值