python用选择法进行排序_Python-选择排序

选择排序算法

选择排序虽然是效率不是很高的排序算法,不过它在我们编程的时候还是会经常使用,出场次数有时候可能要比效率更高的那些算法更高。

首先咱们通过一个动图来了解选择排序的过程:

22f6cf57311e

5863482636c750d9e5cb683374fba9d4.gif

通过这个动图,我们可以发现选择排序的过程为:每次一轮遍历都找到当前最小的元素并和未排序元素的第一个元素交换位置。

接下来编写代码:

def sort(arr):

for j in range(len(arr)-1):

minIndex = j

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

if(arr[i] < arr[minIndex]):

minIndex = i

arr[j],arr[minIndex] = arr[minIndex],arr[j]

def main():

arr = [3,1,2,4,6,7,8,9,5]

sort(arr)

print(arr)

if __name__ == "__main__":

main()

pass

执行会输出:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

使用随机数生成测试用例

通过上面我们已经掌握了选择排序代码的编写了,不过我们会发现,上面代码的测试数组太简单了,只有1-9,这么一段数据集太少了并不能测试我们编写的排序算法到底靠不靠谱。

那如何才能靠谱呢?

你应该已经想到了:加大测试集,增加测试次数,是的,没错,当我们数据量大,测试集非常多的时候这段程序如果依然能正确的进行排序,那我们就可以判断它是一个正确的排序算法了。

好了,问题来了,如何才能生成大量的数据集(比如说一万条)呢?

手写肯定是不行,所以咱们需要通过程序帮我们生成,接下来我们分两步完成生成随机测试用例并测试。

使用随机数生成大量测试集;

测试程序是否已经是排好序的状态。

第一步:随机生成1万条测试用例

使用random模块我们就可以生成随机数了

利用random模块的random.randint(a,b)方法就可以生成从a到b的随机数。

编写代码:

import random

def getRandomArr(num):

arr = []

for i in range(num):

arr.append(random.randint(0,num))

return arr

这段代码可以生成num个从0到num的随机数。

第二部:测试代码编写

接下来我们需要编写一个函数检测数组是否已经是排好序的。

def isSorted(arr):

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

if arr[i] > arr[i+1]:

return False

return True

完整代码:

import random

def sort(arr):

for j in range(len(arr)-1):

minIndex = j

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

if(arr[i] < arr[minIndex]):

minIndex = i

arr[j],arr[minIndex] = arr[minIndex],arr[j]

def main():

arr = getRandomArr(10000) #测试一万条数据

sort(arr)

print(isSorted(arr))#检测是否排好序

#获取随机数

def getRandomArr(num):

arr = []

for i in range(num):

arr.append(random.randint(0,num))

return arr

#检测是否已排序

def isSorted(arr):

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

if arr[i] > arr[i+1]:

return False

return True

if __name__ == "__main__":

main()

pass

这样子我们就完成了一个选择排序的编写与测试啦。

绘图查看选择排序的算法执行效率

仅仅掌握代码怎么写还不够,我们在深入一层,接下来我们看看选择排序的执行效率,时间复杂度。

咱们在执行代码的时候发现当测试集数据量非常大的时候我们的程序非常慢,其实选择排序算是一种效率较低的排序算法,它的代码执行效率为:

math?formula=O(n%5E2)

要直观的查看排序所花的时间我们只需要在排序获取当前时间然后在排序之后获取当前时间即可。

获取当前时间使用到的是:datatime库,要获取执行的时间差,需要四个步骤:

首先导入:import datatime

获取开始时间,结束时间

时间相减

转换格式

示例:

import datetime

startTime = datetime.datetime.now() #获取开始时间

l = [0] * 10000000 #定义一千万个为0的列表或者处理其他任务

endTime = datetime.datetime.now() #获取结束时间

time1 = endTime - startTime #时间相减,得到的是datetime.timedelta对象

#datetime.timedelta对象的'days', 'max', 'microseconds', 'min', 'resolution', 'seconds', 'total_seconds'这些属性是可以调用的

print(time1)

print(str(time1 .seconds) + "." + str(time1 .microseconds//1000) + "s") #输出时间差以秒为单位

在示例中定义了一千万个为0 的列表,执行的结果如下(机器不同时间可能有差别):

0:00:00.064976

0.64s

通过这段代码,我们就可以输出执行某段程序所消耗的时间了。

掌握了如何输出时间差,我们就可以查看选择排序的执行效率了。

完整代码:

import random

import datetime

def sort(arr):

for j in range(len(arr)-1):

minIndex = j

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

if(arr[i] < arr[minIndex]):

minIndex = i

arr[j],arr[minIndex] = arr[minIndex],arr[j]

def main():

arr = getRandomArr(1000)

startTime = datetime.datetime.now()

sort(arr)

endTime = datetime.datetime.now()

#print(isSorted(arr))

expenseTime = endTime - startTime

print(str(expenseTime.seconds) + "." + str(expenseTime.microseconds//1000) + "s")

def getRandomArr(num):

arr = []

for i in range(num):

arr.append(random.randint(0,num))

return arr

def isSorted(arr):

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

if arr[i] > arr[i+1]:

return False

return True

if __name__ == "__main__":

main()

pass

使用matplotlib生成选择排序执行效率折线图

直接输出数值的方式还是不直观,咱们使用图表的方式展示选择排序算法效率的折线图。

import random

import datetime

import matplotlib.pyplot as plt

def sort(arr):

for j in range(len(arr)-1):

minIndex = j

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

if(arr[i] < arr[minIndex]):

minIndex = i

arr[j],arr[minIndex] = arr[minIndex],arr[j]

def main():

timeList = []

#计算

l = [10,100,1000,2000,3000,4000,5000,10000]

for i in l:

arr = getRandomArr(i)

startTime = datetime.datetime.now()

sort(arr)

endTime = datetime.datetime.now()

expenseTime = endTime - startTime

expenseTime = float(str(expenseTime.seconds) + "." + str(expenseTime.microseconds//1000))

timeList.append(expenseTime)

#print(isSorted(arr))

plt.plot(l,timeList)

plt.show()

def getRandomArr(num):

arr = []

for i in range(num):

arr.append(random.randint(0,num))

return arr

def isSorted(arr):

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

if arr[i] > arr[i+1]:

return False

return True

if __name__ == "__main__":

main()

pass

22f6cf57311e

Figure_1.png

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值