(数据结构)各种排序方法的python实现

排序的方法主要有:冒泡,选择,插入,归并,快速排序,还有堆排序前面已经写过,这里就不涉及了)
下面依次对每个排序算法进行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))

动图演示链接https://www.cnblogs.com/jkxsz2333/p/9513901.html
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值