十大排序算法(python代码实现以及动图原理)

1、冒泡排序

'''
核心思想
    1、两两比较,较大的元素往后沉,较小的元素往上漂
    2、每次进行一轮都会确定最底的那个元素
改进
    1、设置一个pos,也就是不交换之前的一个元素,防止下次的遍历到终点
    2、如果元素比较不交换了那就提前停止循环


'''
nums = [3,2,7,5,9,10,4,8]
#冒泡排序
def bubbleSort(nums):
    for i in range(len(nums)):
        k = len(nums)-i

        for j in range(k-1):
            if nums[j]>nums[j+1]:
                nums[j],nums[j+1] = nums[j+1],nums[j]

    return nums


#改进版本
def bubbleSort(nums):
    for i in range(len(nums)):
        k = len(nums)-i
        pos = 0
        for j in range(k-1):
            if nums[j]>nums[j+1]:
                nums[j],nums[j+1] = nums[j+1],nums[j]
                flag = 1
                pos = j
        k = pos
        if not flag:
            break

    return nums

2、选择排序

'''
核心思想
    1、选择一个初始元素,将这个元素认为是最小的元素
    2、进行一轮比较如果找到比该元素还小的,则交换位置
    3、每一轮的进行都可以找到未排序中最小的元素
'''
nums = [3,2,7,5,9,10,4,8]
#冒泡排序
def selectionSort(nums):
    for i in range(len(nums)):
        min = i

        #找到未排序数组中的最小值
        for j in range(i+1,len(nums)):
            if nums[j]<nums[min]:
                min = j

        #交换元素
        nums[i],nums[min] = nums[min],nums[i]
    return nums

3、插入排序

'''
核心思想
    1、从第一个元素开始,该元素可以认为已经被排序
    2、取出下一个元素,从后向前扫描
    3、如果当前的元素是小于上一个元素的,那么将前一个元素的值赋给当前元素,然后索引减1
    4、重复3步骤,直到找到已经排序的元素小于或者等于新元素的位置
    5、将新元素插入到该位置
    3、重复2-5即可完成插入排序
'''
nums = [3,2,7,5,9,10,4,8]
#插入排序
def insertionSort(nums):
    for i in range(1,len(nums)):
        #选取前一个元素和当前元素
        preIndex = i-1
        current = nums[i]

        #如果索引大于等于0 且前一个元素是大于当前元素的,进行移动
        while preIndex>=0 and nums[preIndex]>current:
            nums[preIndex+1] = nums[preIndex]
            preIndex-=1
        nums[preIndex+1] = current
    return nums

4、希尔排序

5、归并排序

'''
核心思想
    1、将原数组的输入序列分成两个子长度为n/2的子序列
    2、对这两个子序列分别采用归并排序
    3、然后将两个排序好的子序列合并成一个最终的排序序列。
'''
nums = [3,2,7,5,9,10,4,8]
#插入排序
def mergerSort(nums):
    if len(nums)<2:
        return nums
    mid = len(nums)//2
    left = nums[:mid]
    right = nums[mid:]
    return merge(mergerSort(left), mergerSort(right))

#将两个有序的数组合并成一个数组
def merge(left,right):
    res = []
    while len(left)>0 and len(right)>0:
        print(left, '----递归', right)
        if left[0]<=right[0]:
            res.append(left.pop(0))
        else:
            res.append(right.pop(0))

    if left:
        res.extend(left)
    if right:
        res.extend(right)
    return res

6、快速排序

'''
核心思想
    1、从数列中挑出一个元素,成为基准
    2、重新排序数列,所有比基准小的元素摆放在基准前面,所有比基准数值大的元素摆在基准后面,排序后基准就在数列的中间位置。(分区操作)
    3、递归的把小于基准值元素的子数列和大于基准值元素的子数列排序。
'''
nums = [3,2,7,5,9,10,4,8]
#快速排序
def quick_sort(nums,i,j):
    if i >= j:
        return list
    pivot = nums[i]
    low = i
    high = j
    while i < j:
        #交换比基准小的到左边
        while i < j and nums[j] >= pivot:
            j -= 1
        nums[i]=nums[j]

        #交换比基准大的到右边
        while i < j and nums[i] <=pivot:
            i += 1
        nums[j]=nums[i]
    nums[j] = pivot
    #递归排序左子数组
    quick_sort(nums,low,i-1)
    #递归排序右子数组
    quick_sort(nums,i+1,high)
    return nums

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值