用python实现常见排序算法
排序列表:a=[1, 11, 17, 15, 14, 18, 19, 5, 6, 18]
冒泡排序法
原理:依次比较相邻元素的大小,并将大的元素后移,那么经过第一轮的排序后,最大值已经排到最后一位了;第二轮排序时,只需要将前len(a)-1个元素排序即可;依次重复len(a)-1轮即可完成排序
实现代码:
#冒泡排序
for i in range(len(a)-1):
for j in range(len(a)-i-1):
if a[j]>a[j+1]:
a[j],a[j+1]=a[j+1],a[j]
print(a)
优化思路:如果某一轮两两比较中没有任何元素交换,这说明已经都排好序了,算法结束,可以使用一个Flag做标记,默认为false,如果发生交互则置为true,每轮结束时检测Flag,如果为true则继续,如果为false则返回。
#冒泡排序算法优化
for i in range(len(a)-1):
flag=False
for j in range(len(a)-i-1):
if a[j]>a[j+1]:
a[j],a[j+1]=a[j+1],a[j]
flag=True
print("第{}轮排序,结果为:{}".format(i,a))
if not flag:
break
插入排序法
算法思想:遍历数组,遍历到 i 时,a0,a1…ai-1是已经排好序的,取出ai,从ai开始向前相邻两个比较大小,如果后面元素小于前面,则互换位置,如果不小于,则直接跳出该轮的循环。当待排序的数据基本有序时,插入排序的效率比较高,只需要进行很少的数据移动。
#插入排序法
for i in range(1,len(a)):
for j in range(i,0,-1):
print("i:{},j:{},a[{}]={},a[{}]={}".format(i,j,j,a[j],j-1,a[j-1]))
if a[j]<a[j-1]:
a[j],a[j-1]=a[j-1],a[j]
print("第{}-{}轮排序结果为:{}".format(i,j,a))
else:
break #由于前j-1个元素已经按照从小到大的顺序排列好了,如果发现第j个大于第j-1个元素,则可以不用进行该轮的两两比较了
快速排序法
算法思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
#快速排序法
def quick_sort(data):
if len(data)>=2:
mid=data[len(data)//2]#选取一个基准值,可以是第一个也可以是最后一个,随机选
left,right=[],[]
data.remove(mid) #删除基准值,那基准值和剩下的元素一一比较,并分别将大于和小于等于基准值的元素分别放在右列表和左列表中
for num in data:
if num>mid:
right.append(num)
else:
left.append(num)
return quick_sort(left)+[mid]+quick_sort(right)
else:
return data
选择排序法
算法思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。
#选择排序法
for i in range(len(a)-1):
min_index=i
for j in range(i+1,len(a)):
if a[j]<a[min_index]:
min_index=j
a[i],a[min_index]=a[min_index],a[i]
print(a)