冒泡排序
(拿一个数去和其他数比)数组中的一个元素分别和数组中的其他元素比较,满足一定要求时,便将两数的索引进行交换,不停的进行此操作。(此方法表示在原地进行)
def bubble_sort(li):
for i in range(len(li)-1):
for j in range(len(li)-i-1):
if li[j]>li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
选择排序
不停遍历整个数组,将满足要求的元素取出放入一个新列表中
(此代码复杂度较高)
def select_sort_simple(li):
li=[]
for i in range(len(li)):
min_val=min(li)
li.append(min_val)
li.remove(min_val)
return li
插入排序
三、插入排序:(用其他数与一个数比)控制前方数字,将后面的数字陆续与前方的数字做比较,满足要求时便将数字插入即可(原地进行)
def insert_sort(li):
for i in range(1,len(li)):
tmp=li[i]
j=i-1
while li[j]>tmp and j>=0:
li[j+1]=li[j]
j-=1
li[j+1]=tmp
快速排序
先将第一个元素取出,然后现在开始用右边的数与其比较,若有一个比其小的数,便将这个数移到取出的第一个元素的位置,这时,这个数的位置便又空了,接着就需要看左边比取出元素大的数,将其移到右边空的位置,然后再看右边比取出元素小的数移到左边的位置,周而复始的左右左右移动,即可完成程序
def partition(li,left,right):
tmp=li(left)
while left<right:
while li[right]>=tmp and left<right:
right-=1
li[left]=li[right]
while left<right and li[left]<=tmp:
left+=1
li[right]=li[left]
li[left]=tmp
归并排序
五、归并排序:即对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的。归并一般使用情况是先分解,即将列表越分越小,直至分成一个元素;终止条件是当一个元素是有序的;最后是合并是将两个有序列表归并,列表越来越大.
def merge(li,low,mid,high):
i=low
j=mid+1
tmp=[]
while i<=mid and j<=high:
if li[i]<li[j]:
tmp.append(li[i])
i+=1
else:
tmp.append(li[j])
j+=1
while i<=mid:
tmp.append(li[i])
i+=1
while j<=high:
tmp.append(li[i])
j+=1
li[low:high+1]=tmp
希尔排序
是一种分组插入排序算法,首先取一个整数d1=n//2,将元素分为d1个组,每组相邻量元素之间距离为d1,在各组内进行直接插入排序,同理之后取第二个整数d2=d1//2,继续以上操作,直至dn=1,就表明已将所有元素在同一组内进行直接插入排序。注:希尔排序每次遍历排序并没有使一些元素有序,是混乱的,但是整体是趋于有序的
def insert_sort_gap(li,gap):
for i in range(gap,len(li)):
tmp=li[i]
j=i-gap
while j>=0 and li[j]>tmp:
li[j+gap]=li[j]
j-=gap
li[j+gap]=tmp
print(li)
def shell_sort(li):
d=len(li)//2
while d>=1:
insert_sort_gap(li,d)
d//=2
|