堆排序
快速排序
快速排序一般选择序列的两头位置,分别记为low和high,第一遍排序将low指针对应的值作为一个key值,试图将大于key值的放在它的右边,小于key值的放在左边。具体实现是以key为标准,将high指针依次向左移动,直到找到一个high对应的值小于key值为止,将此时high指针对应的值和key值互换;然后以此时key值对应的指针为对照标准(即此时high的位置),对比key值和此时low指针对应的值大小,如果low对应的值大于key值,则low对应的值和key互换,否则将low指针依次右移一个单位,直到low=high或者找到一个low指针对应的值大于key值。经过以上第一轮排序,原来的序列被key值分为了两部分,此时调用递归方法将这两个子序列分别排序,直到最终变成一个有序序列。时间复杂度为:nlogn。
方法一(按照步骤,将每个阶段分开写的):
def swap(list,a,b):
c=list[a]
list[a]=list[b]
list[b]=c
return list
def pivot_sperate(list,low,high):
key=list[low]
while low < high:
while low<high and list[high]>key:
high-=1
list=swap(list,low,high)
while low<high and list[low]<key:
low+=1
list=swap(list,high,low)
return low
def quick_sort(list,low,high):
if low<high:
pivot=pivot_sperate(list,low,high)
quick_sort(list,low,pivot-1)
quick_sort(list,pivot+1,high)
return list
list=[7,4,2,1,5,3,6,9,8,10]
last_list=quick_sort(list,0,len(list)-1)
print(last_list)
方法二(与方法一思想一样,代码融合在一起了):
def QuickSort(myList,start,end):
#判断low是否小于high,如果为false,直接返回
if start < end:
i,j = start,end
#设置基准数
base = myList[i]
while i < j:
#如果列表后边的数,比基准数大或相等,则前移一位直到有比基准数小的数出现
while (i < j) and (myList[j] >= base):
j = j - 1
#如找到,则把第j个元素赋值给第个元素i,此时表中i,j个元素相等
myList[i] = myList[j]
#同样的方式比较前半区
while (i < j) and (myList[i] <= base):
i = i + 1
myList[j] = myList[i]
#做完第一轮比较之后,列表被分成了两个半区,并且i=j,需要将这个数设置回base
myList[i] = base
#递归前后半区
QuickSort(myList, start, i - 1)
QuickSort(myList, j + 1, end)
return myList
myList = [7,4,2,1,5,3,6,9,8,10]
print("Quick Sort: ")
QuickSort(myList,0,len(myList)-1)
print(myList)
归并排序
归并排序算法是采用分治法的典型应用,将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
例:设有数列{6,202,100,301,38,8,1}
初始状态:6,202,100,301,38,8,1
第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3;
第二次归并后:{6,100,202,301},{1,8,38},比较次数:4;
第三次归并后:{1,6,8,38,100,202,301},比较次数:4;
总的比较次数为:3+4+4=11;
def MergeSort(lists):
if len(lists) <= 1:
return lists
num = int( len(lists) / 2 )
left = MergeSort(lists[:num])
right = MergeSort(lists[num:])
return Merge(left, right)
def Merge(left,right):
r, l=0, 0
result=[]
while l<len(left) and r<len(right):
if left[l] < right[r]:
result.append(left[l])
l += 1
else:
result.append(right[r])
r += 1
result += left[l:]
result += right[r:]
return result
if __name__=='__main__':
list0=[1, 2, 3, 4, 5, 6, 7, 90, 21, 23, 45]
list=MergeSort(list0)
print (list)