先来一个随机数数组生成器,为的是给排序提供数据
import random
def generat(n,numberl,number2):
list=[]
for i in range(n):
a=random.randint(numberl,number2)
list.append(a)
return list
if __name__ == '__main__':
print generat(10,5,15)
为什么要学习O(n^2)的排序算法
1.因为这是一般的算法基础,比如再面试时,可以先摆出这个算法,往往再写出这个算法的时候,往往都有思路了,这样可以让面试官看到你的想法。
2.编码简单,易于实现,是一些简单情景的首选
3.在一些特殊情况下,简单的排序算法更加有效
4.简单的排序算法是衍生出复杂的排序算法的起步基础
5.可以作为其它复杂算法的作子过程,改进更加复杂的算法。
排序算法 O(n^2)
先来几个简单的算法
最基本的排序
1.概念介绍
1.首先在列表中找最小的元素,放到数列的前边
2.在剩下的数列中找到最小的元素,放到剩下的数列的前边。
3.重复。
2.代码展示
def selectSort(list):
for i in range(len(list)):
minIndex=i
for j in range(i+1,len(list)):
if list[minIndex] < list[j]:
list[minIndex],list[j]=list[j],list[minIndex]
return list
注意:主要自己去实现一些自定义算法的实现。
在算法设计的时候,如何考量算法的效率?这里就要编写一个算法效率检验函数,用time函数来完成就可以了。用c语言0.18秒就能完成10000的排序,而python要4.5秒。
注意:今天又试了一下c++与python的效率,有时候的简单循环,python的效率竟然比c++还要高,那么python的循环中如果比c++慢的话,肯定是里边用了其它的高级语法。具体怎么回事需要自己去继续研究。
插入排序
1.概念介绍
首先以第一个元素为基准,再将这个元素与前一个元素相比较,如果后边这个元素比前边这个元素小,则与前一个交换,交换后再与前一个比较(如果有的话),依次比较到第一个元素。每次比较一次结束后,比较过的这些数组都是有序的。
2.代码展示
def insertSort(list):
timea=time.time()
for i in range(1,len(list)):
for j in range(len(list)-i,len(list)):#倒着来,当i等于0时,那么就是第一个,这个时候也是导数第len(list)个,如果i时最后一个时,那么也就是说可能要比较前边的全部元素,就是range(0,len(list))
if list[-j]<list[-j-1]:
list[-j],list[-j-1]=list[-j-1],list[-j]
else:
break
timeb=time.time()
print timeb-timea
return list
奇怪的时插入排序的执行实践比选择排序花费时间要多!!!!
其实再插入排序算法中时,里边有很多交换算法,相对于选择排序里的比较,所以更加耗时。
冒泡排序
1.概念介绍
第 1 次将第一个数与第 2 个数比较,如果第 1 个数大于第 2 个数,那么将第 1 个数与第 2 个数交换,这个时候前边最大的数就放到后边了,之后再将最大的这个数与下一个比较,如果比下一个大的话就与下一个交换,那么这样的话只要前边比较过的都在后边去了。比如现在是比较到了第i个,如果第i+1个大于第i个的话,那么这个时候第i+1个就是最大的,那么不管,继续比较第i+2个就是了;否则,如果第i+1个小于第i个的话,那么将第i个与第i+1个互换,这样换了之后,第i+1个依然是最大的一个,那么继续和第i+2个比较就是了。如此循环往复,每次比较完了,最大的那个数就放到了后边。
2.代码展示
for i in range(len(list)):
for j in range(0,len(list)-1-i):#这里要防止它越界,因为下边有一个j+1,所以虽然这里-1了,但是不会疏忽这块的。
if list[j]<list[j+1]:
list[j],list[j+1]=list[j+1],list[j]