import random
'''
排序方法:冒泡、选择、插入、希尔、快排、归并
'''
def dataPlan():
return random.sample(range(1, 100), 10)#在1-100范围内生成10个不重复随机数
def view(list):
for i in list:
print(i,end=" ")
print()
def swapData(list,i,j):
temp=list[i]
list[i]=list[j]
list[j]=temp
#冒泡排序
def bubbleSort(list):
for i in range(len(list)-1):#冒泡趟数:len-1次
# 每趟冒一个泡: 每次都是从j = 0开始,依次让j和j + 1进行比较,若逆序则交换
for j in range(len(list)-1-i):
if(list[j]>list[j+1]):#大的元素放后面,升序排序 < 降序排序
swapData(list,j,j+1)
def bubbleSortBetter(list):
for i in range(len(list)-1):
flag=True#先假定已经有序
for j in range(len(list)-1-i):
if(list[j]>list[j+1]):#大的元素放后面,升序排序 < 降序排序
swapData(list,j,j+1)
flag=False#有交换就是非"有序"
if(flag):break#如果有序了,就退出
#选择排序
def selectSort(list):
for i in range(len(list)-1):#选择趟数:len-1次
# 第i个元素选择时,从后面开始,依次比较,逆序时交换
for j in range(i+1,len(list)):
if(list[i]>list[j]):#大的元素放后面,升序排序 < 降序排序
swapData(list,i,j)
def selectSortBetter(list):
for i in range(len(list)-1):
k=i#用k记录第i趟中最小数的位置
for j in range(i+1,len(list)):
if(list[k]>list[j]):#大的元素放后面,升序排序 < 降序排序
k=j
#经过上面的循环,list[k]一定是第i趟中最小的元素
if(k!=i):swapData(list,k,i)#最多交换n次,以前是n*n次
#插入排序
def insertSort(list):
for i in range(len(list)-1):#趟数:len(list)-1
temp=list[i+1]#备份待插入的元素到temp中
j=i#从i开始倒序(从后往前)进行遍历查找待插入位置
while(list[j]>temp):
list[j+1]=list[j]#若list[j]大于temp则让list[j]往后挪一个位置
j-=1
if(j<0):break
#经过上面的循环操作,j + 1位置就是temp将要放置的。
# 因为此时只有两种情况: temp >= a[j] 或 j = -1
list[j+1]=temp
def insertSortBetter(list):
for i in range(len(list)-1):#趟数:len(list)-1
temp=list[i+1]#备份待插入的元素到temp中
#用二分查找出temp将要放置的位置
low,high,mid=0,i,None
while(low<=high):
mid=(low+high)>>1
if(list[mid]>temp):
high=mid-1
else:
low=mid+1
#经过上面循环的操作,找到temp将要放置的位置是:high+1或者low
#把从high+1到i区间内的元素依次往后挪一个位置
for j in range(i,high,-1):
list[j+1]=list[j]
#让temp放置在high + 1
list[high+1]=temp
#希尔排序
'''
希尔排序: 是一种优化算法,用于优化越有序越有利的排序算法。
基本思想: 当序列非常无序时,gap很大(组内元素很少),此时排序比较快(即使是n*n但n很少)。
当gap越来越小时(组内元素越来越多),此时排序也比较快,因为越来越有序了。
'''
def shellSort(list):
gap=(len(list)+1)>>1#分组
while True:
#组内排序(使用越有序越有利的排序算法如插入排序法,这里方便理解用冒泡
for i in range(len(list)-gap):
for j in range(i,len(list)-gap,gap):
if(list[j]>list[j+gap]):swapData(list,j,j+gap)
if(gap>1):gap=(gap+1)>>1
else:break
#快速排序
'''
划分: 把a[p....r]范围内的元素进行划分,返回j
实现的功能:j为枢轴的位置,a[p...j-1]为左半区(小区),a[j+1...r]为右半区(大区)
'''
def partition(list,p,r):
'''
i用于左侧遍历的游标-->找一个大于枢轴的数
j用于右侧遍历的游标-->找一个小于枢轴的数
x 把枢轴备份到x中
'''
i,j,x=p,r+1,list[p]
while True:
#用i遍历,在左侧找一个大于枢轴的数
i+=1
while(list[i]<x and i<r): i+=1
#用j遍历,在右侧找一个小于枢轴的数
j-=1
while(list[j]>x):j-=1
if(i>=j):break
#把i和j位置的元素交换一下
swapData(list,i,j)
#把枢轴(目前是p位置)交换到中间位置(j)
swapData(list,p,j)
return j#枢轴的位置
def quickSort(list,p,r):
if(p<r):#至少要有两个元素才划分
#划分结果: 左半区a[0,q-1], 枢轴a[q], 右半区a[q+1,r]
q=partition(list,p,r)
quickSort(list,0,q-1)
quickSort(list,q+1,r)
#归并排序
#归并方法:把两个有序子序列合并成一个有序序列
def merge(list1,list2,left,mid,right):
'''
把左子序列list1[left,mid] 和 右子序列list1[mid+1,right]归并到list2[left,right]
p:遍历左子序列的游标
r:遍历右子序列的游标
k:归并结果序列的游标---当前归并元素在结果集中的放置位置
'''
p,r,k=left,mid+1,left
while(p<=mid and r<=right):
if(list1[p]<list1[r]):
list2[k]=list1[p]
k+=1
p+=1
else:
list2[k]=list1[r]
k+=1
r+=1
#经过上面的循环,一定有一个子序列已经归并完成
#只时只要把没归并完的那个子序列剩下的元素直接照搬到结果集中就行
if(p>mid):
for i in range(r,right+1):
list2[k]=list1[i]
k+=1
else:
for i in range(p,mid+1):
list2[k]=list1[i]
k+=1
def mergeSort(list,left,right):
if(left<right):#至少两个元素
#先分解
mid=(left+right)>>1
mergeSort(list,left,mid)
mergeSort(list,mid+1,right)
#再归并
list2=[None]*len(list)
merge(list,list2,left,mid,right)
#把辅助序列list2中的数据拷回到list中
for i in range(left,right+1):
list[i]=list2[i]
def testSoft():
print("----------------a")
print("冒泡排序,数据如下:")
list=dataPlan()#产生数据
view(list)#数据打印
print("排序结果:")
bubbleSort(list)#冒泡排序
view(list)
print("----------------b")
print("优化冒泡排序,数据如下:")
list = dataPlan() # 产生数据
view(list) # 数据打印
print("排序结果:")
bubbleSortBetter(list) # 冒泡排序
view(list)
print("----------------c")
print("选择排序,数据如下:")
list = dataPlan() # 产生数据
view(list) # 数据打印
print("排序结果:")
selectSort(list) # 选择排序
view(list)
print("----------------d")
print("优化选择排序,数据如下:")
list = dataPlan() # 产生数据
view(list) # 数据打印
print("排序结果:")
selectSortBetter(list) # 选择排序
view(list)
print("----------------e")
print("插入排序,数据如下:")
list = dataPlan() # 产生数据
view(list) # 数据打印
print("排序结果:")
insertSort(list) # 插入排序
view(list)
print("----------------f")
print("优化插入排序,数据如下:")
list = dataPlan() # 产生数据
view(list) # 数据打印
print("排序结果:")
insertSortBetter(list) # 插入排序
view(list)
print("----------------g")
print("优化插入排序,数据如下:")
list = dataPlan() # 产生数据
view(list) # 数据打印
print("排序结果:")
insertSortBetter(list) # 插入排序
view(list)
print("----------------h")
print("希尔排序,数据如下:")
list = dataPlan() # 产生数据
view(list) # 数据打印
print("排序结果:")
shellSort(list) # 插入排序
view(list)
print("----------------i")
print("快速排序,数据如下:")
list = dataPlan() # 产生数据
view(list) # 数据打印
print("排序结果:")
quickSort(list,0,len(list)-1) # 快速排序
view(list)
print("----------------i")
print("归并排序,数据如下:")
list = dataPlan() # 产生数据
view(list) # 数据打印
print("排序结果:")
mergeSort(list,0,len(list)-1) # 归并排序
view(list)
testSoft()
座右铭:站在别人的思想上,看见自己的不足,传播错误的经验,愿君不重蹈覆辙。
由于受限于本人经验,难免不足,如有建议,欢迎留言交流。