排序的方法主要有:冒泡,选择,插入,归并,快速排序,还有堆排序(前面已经写过,这里就不涉及了)
下面依次对每个排序算法进行python实现:
冒泡
冒泡排序从小到大排序:一开始交换的区间为0~N-1,将第1个数和第2个数进行比较,前面大于后面,交换两个数,否则不交换。再比较第2个数和第三个数,前面大于后面,交换两个数否则不交换。依次进行,最大的数会放在数组最后的位置。然后将范围变为0-N-2,数组第二大的数会放在数组倒数第二的位置。依次进行整个交换过程,最后范围只剩一个数时数组即为有序。
1.2 动图
##这里实现的是从小到大排
def bubbleSort(seq=None):
num=len(seq)
for i in range(num):
for j in range(num-i-1):
if seq[j]<seq[j+1]:
seq[j],seq[j+1]=seq[j+1],seq[j]
return seq
if __name__=="__main__":
print(bubbleSort([10, 1, 3, 5, 7, 9, 2, 4, 6, 8, 11, 15, 0, 12, 14, 13]))
选择排序
一开始从0-n-1区间上选择一个最小值,将其放在位置0上,然后在1~n-1范围上选取最小值放在位置1上。重复过程直到剩下最后一个元素,数组即为有序。
def selectSort(seq=None):
num=len(seq)
for i in range(num):
min_index=i
for j in range(i+1,num):
if seq[min_index]>seq[j]:
min_index=j
seq[min_index],seq[i]=seq[i],seq[min_index]
return seq
if __name__=="__main__":
#打印结果为:[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(selectSort([10, 1, 3, 5, 7, 9, 2, 4, 6, 8, 11, 15, 0, 12, 14, 13]))
插入排序
首先位置1上的数和位置0上的数进行比较,如果位置1上的数大于位置0上的数,将位置0上的数向后移一位,将1插入到0位置,否则不处理。位置k上的数和之前的数依次进行比较,如果位置K上的数更大,将之前的数向后移位,最后将位置k上的数插入不满足条件点,反之不处理
def insertionSort(seq=None):
n=len(seq)
for i in range(1,n):
x=seq[i]
for j in range(i,-1,-1):
if x<seq[j-1]:
seq[j]=seq[j-1]
else:
break
seq[j]= x
return seq
if __name__=="__main__":
#打印结果为:[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(insertionSort([10, 1, 3, 5, 7, 9, 2, 4, 6, 8, 11, 15, 0, 12, 14, 13]))
归并
首先让数组中的每一个数单独成为长度为1的区间,然后两两一组有序合并,得到长度为2的有序区间,依次进行,直到合成整个区间。
def mergeSort(seq=None):
n=len(seq)
if n<2:
return seq
left=mergeSort(seq[:n//2])
right=mergeSort(seq[n//2:])
res=merge(left,right)
return res
def merge(left,right):
if not left:
return right
if not right:
return left
result=[]
i,j=0,0
while(i<len(left) and j<len(right)):
if left[i]<right[j]:
result.append(left[i])
i+=1
else:
result.append(right[j])
j+=1
if i<len(left):
result+=left[i:]
if j<len(right):
result+=right[j:]
return result
if __name__=="__main__":
#打印结果为:[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(mergeSort([10, 1, 3, 5, 7, 9, 2, 4, 6, 8, 11, 15, 0, 12, 14, 13]))
快排
在数组中随机选一个数(默认数组首个元素),数组中小于等于此数的放在左边,大于此数的放在右边,再对数组两边递归调用快速排序,重复这个过程。
def quickSort(seq,start,end):
if start<end:
split=partition(seq,start,end)
quickSort(seq,start,split-1)
quickSort(seq,split+1,end)
return seq
def partition(seq,start,end):
##选取第一个值为分割点
val=seq[start]
while start<end:
while start<end and seq[end]>val:
end-=1
seq[start]=seq[end]
while start <end and seq[start]<val:
start+=1
seq[end]=seq[start]
seq[start]=val
return start
if __name__=="__main__":
#打印结果为:0,1,2,3,4,5,6,7,8,9,10,11,12,13
l=[10, 1, 3, 5, 7, 9, 2, 4, 6, 8, 11, 15, 0, 12, 14, 13]
print(quickSort(l,0,len(l)-1))