python实现堆排序、快速排序、归并排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010420283/article/details/82381873

堆排序

快速排序

    快速排序一般选择序列的两头位置,分别记为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)

猜你喜欢

转载自blog.csdn.net/u010420283/article/details/82381873