# -*- coding:utf-8 -*-
'''
In-place sort(不占用额外内存或占用常数的内存):插入排序、选择排序、冒泡排序、堆排序、快速排序。
Out-place sort:归并排序、计数排序、基数排序、桶排序。
stable sort:插入排序、冒泡排序、归并排序、计数排序、基数排序、桶排序。
unstable sort:选择排序(5 8 5 2 9)、快速排序、堆排序。
'''
a_list = [6,7,5,4,3,2]
'''
插入排序:
1、从第一个元素开始,该元素可以认为已经被排序
2、取出下一个元素,在已经排序的元素序列中从后向前扫描
3、如果该元素(已排序)大于新元素,将该元素移到下一位置
4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5、将新元素插入到该位置后
6、重复步骤2~5
'''
def insert_sort(list_n):
for i in range(1,len(list_n)):
key = list_n[i]
j = i-1
while j>=0 and list_n[j]>key:
list_n[j+1]=list_n[j]
j -=1
list_n[j+1]=key
return list_n
#print(insert_sort(a_list))
'''
def BinInsert_sort(list_n):
for i in range(1,len(list_n)):
key = list_n[i]
left =0
right=i-1
while(left<=right):
mid = (left+right)/2
if list_n[mid]>key:
right = mid-1
else:
left = mid+1
for j in range(i-1,left,-1):
list_n[j+1]=list_n[j]
print list_n[j+1]
print "+"*20
list_n[left] = key
return list_n
print BinInsert_sort(a_list)
'''
'''
冒泡排序:
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
'''
def bubble_sort(list_n):
k = len(list_n)
while k>0:
for i in range(len(list_n)-1):
if list_n[i]>list_n[i+1]:
list_n[i]=list_n[i]+list_n[i+1]
list_n[i+1]=list_n[i]-list_n[i+1]
list_n[i]=list_n[i]-list_n[i+1]
k -=1
return list_n
#print bubble_sort(a_list)
'''
鸡尾酒排序/双向冒泡排序:
1、依次比较相邻的两个数,将小数放在前面,大数放在后面;
2、第一趟可得到:将最大数放到最后一位。
3、第二趟可得到:将第二大的数放到倒数第二位。
4、如此下去,重复以上过程,直至最终完成排序。
'''
def cocktail_sort(list_n):
for i in range(0,len(list_n)-1):
for j in range(i+1,len(list_n)):
if list_n[i]>list_n[j]:
list_n[i]=list_n[i]+list_n[j]
list_n[j]=list_n[i]-list_n[j]
list_n[i]=list_n[i]-list_n[j]
return list_n
#print(cocktail_sort(a_list))
'''
选择排序:
1、初始状态:无序区为R[1..n],有序区为空。
2、第i趟排序(i=1,2,3...n-1)
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i..n)。
该趟排序从当前无序区中选出关键字最小的记录 R[k],将它与无序区的第1个记录R交换,
使R[1..i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
3、前n-1趟结束,数组有序化了
'''
def select_sort(list_n):
for i in range(len(list_n)-1):
temp = i
for j in range(i+1,len(list_n)):
if list_n[temp]>list_n[j]:
temp = j
if i!=temp:
list_n[i]=list_n[i]+list_n[temp]
list_n[temp]=list_n[i]-list_n[temp]
list_n[i]=list_n[i]-list_n[temp]
return list_n
#print(select_sort(a_list))
'''
归并排序:
1、Divide: 把长度为n的输入序列分成两个长度为n/2的子序列。
2、Conquer: 对这两个子序列分别采用归并排序。
3、Combine: 将两个排序好的子序列合并成一个最终的排序序列。
'''
def merge_sort(list_n):
if len(list_n)<=1:
return list_n
m = int(len(list_n)/2)
p_list = merge_sort(list_n[:m])
q_list = merge_sort(list_n[m:])
return merge(p_list,q_list)
def merge(p,q):
temp =[]
i,j = 0,0
while i<len(p) and j <len(q):
if p[i]<=q[j]:
temp.append(p[i])
i +=1
else:
temp.append(q[j])
j +=1
temp +=p[i:]
temp +=q[j:]
return temp
#print(merge_sort(a_list))
'''
希尔排序:
通过比较不同步长下表列表,第一次分为两组,即步长为group=len(list)/2来进行比较i与i+group大小;
下组则为上一个步长的一半,group= group/2进行新一轮二分之一步长大小比较i与i+group;
直至步长为1时,排序完成。
'''
def shell_sort(list_n):
len_l = len(list_n)
step = 2
group = len_l/step
while group>0:
for i in range(0,group):
j = i+group
while j <len_l:
k = j-group
key = list_n[j]
while k>=0:
if list_n[k]>key:
list_n[k+group]=list_n[k]
list_n[k]=key
k -=group
j +=group
group /=step
return list_n
#print shell_sort(a_list)
'''
快速排序:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=L[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值L[j],将L[j]和L[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的L[i],将L[i]和L[j]互换;
5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中L[j]不小于key,4中L[i]不大于key的时候改变j、i的值,
使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。
另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。
'''
def quick_sort(L, low, high):
i = low
j = high
if i >= j:
return L
key = L[i]
while i < j:
while i < j and L[j] >= key:
j = j-1
L[i] = L[j]
while i < j and L[i] <= key:
i = i+1
L[j] = L[i]
L[i] = key
quick_sort(L, low, i-1)
quick_sort(L, j+1, high)
return L
#print quick_sort(a_list,0,len(a_list)-1)
'''
堆排序:
'''
def MinHeapFixup(L,i):
temp = L[i]
j = (i-1)/2
while j >0 and i !=0:
if L[j]<=temp:
break
L[i] = L[j]
i = j
j = (i-1)/2
L[i] = temp
def MinHeapAddNumber(L,n,nNum):
L[n] = nNum
MinHeapFixup(L,n)
def MinHeapFixdown(L,i,n):
temp = L[i]
j = 2*i+1
while j<n:
if j+1<n and L[j+1]<L[j]:
j +=1
if L[j]>=temp:
break
L[i] = L[j]
i = j
j = 2*i+1
L[i] = temp
def MinHeapDeleteNumber(L,n):
L[0],L[n-1] = L[n-1], L[0]
MinHeapFixdown(L,0,n-1)
def MakeMinHeap(L,n):
for i in range(n/2-1,-1,-1):
MinHeapFixdown(L,i,n)
Python实现几种排序算法
最新推荐文章于 2024-09-14 08:25:16 发布