面试之排序算法python实现

冒泡排序算法:复杂度o(n^2)

def swap(arr, i, j):
    temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp
    return arr
    
def maopao(arr):
    n=len(arr)
    for i in range(n):
        for j in range(0,n-i-1):
            if arr[j+1]<arr[j]:
                swap(arr,j+1,j)
    return arr

选择排序:复杂度o(n^2)
思想:每次从数组里选一个最小的元素直接放到有序区的前面,直到整个数组变有序区

def select_sort(arr):
    n = len(arr)
    for i in range(n):
        m = i
        for j in range(i + 1, n):
            if arr[m] > arr[j]:
                m = j
        arr = swap(arr, i, m)
    return arr

插入排序:复杂度o(n^2)
每次将一个待排序的数据,跟前面已经有序的序列的数字比较,找到自己合适的位置

def insert_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(i):
            if arr[j] > arr[i]:
                arr = swap(arr, j, i)
    return arr

希尔排序:复杂度o(n^1.3)
思想:先将整个待排元素序列分割成若干个子序列后进行直接插入排序

def shell_sort(arr):
    n=len(arr)
    step=n//2
    while step!=0:
        for i in range(step):
            j=i
            while j<n:
                if j+step<n and arr[j+step]<arr[j]:
                    swap(arr,j+step,j)
                j+=step
        step=step//2
    return arr

快排:复杂度o(nlogn)
思想:二分治法,选取一个基准数,小于基准数放在左边,大于放在右边

def quick_sort(arr, start, end):
    if start >= end:
        return arr
    left = start
    right = end
    mid = arr[end]
    while left < right:
        while arr[left] < mid and left < right:
            left += 1
        while arr[right] >= mid and left < right:
            right -= 1
        arr = swap(arr, left, right)
    if arr[left] >= arr[end]:
        arr = swap(arr, left, end)
    else:
        left += 1
    arr = quick_sort(arr, start, left - 1)
    arr = quick_sort(arr, left + 1, end)
    return arr

堆排序:复杂度o(nlogn)

def heapify(arr,n,i):
    l=2*i+1#左
    r=2*i+2#右
    lar=i
    if l<n and arr[l]>arr[lar]:
        lar=l
    if r<n and arr[r]>arr[lar]:
        lar=r
    if lar!=i:
        arr[lar],arr[i]=arr[i],arr[lar]
        heapify(arr, n, lar)
    return arr

def heapify_sort(arr):
    n=len(arr)
    for i in range((n-1)//2,-1,-1):
        arr=heapify(arr,n,i)
    for i in range(n-1,0,-1):
        arr[i], arr[0] = arr[0], arr[i]
        arr=heapify(arr,i,0)
    return arr

归并排序

def merge(left,right):
    temp=[]
    i=0
    j=0
    while i<len(left) and j<len(right):
        if left[i]<right[j]:
            temp.append(left[i])
            i+=1
        else:
            temp.append(right[j])
            j += 1
    while i<len(left):
        temp.append(left[i])
        i += 1
    while j<len(right):
        temp.append(right[j])
        j += 1
    return temp

def merge_sort(arr):
    n=len(arr)
    if n<=1:
        return arr
    middle=n//2
    left=merge_sort(arr[:middle])
    right=merge_sort(arr[middle:])
    return merge(left,right)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值