python中的各种排序:选择排序,快速排序,冒泡排序,插入排序

直接插入排序

def insertSort(nums):
    '''
    直接插入排序,时间复杂度n2
    :param nums: 待排序列表
    :return:
    '''
    i = 1
    # 将nums[i]插入有序子列表
    while i < len(nums):
        if nums[i] < nums[i - 1]:
            # 将待插入值复制给哨兵
            povitvalue = nums[i]
            nums[i] = nums[i - 1]
            j = i - 2
            while nums[j] > povitvalue and j >= 0:
                nums[j + 1] = nums[j]
                j -= 1
            nums[j + 1] = povitvalue
        i += 1
    return nums

快速排序

def partition(nums, low, high):
  '''
  交换顺序表nums中的记录,返回枢轴位置
  :param nums: 待排序的顺序表
  :param low: 开始索引
  :param high: 结束索引
  :return:
  '''
  pivotkey = nums[low]
  while low < high:
      while low < high and nums[high] >= pivotkey:
          high -= 1
      nums[low] = nums[high]

      while low < high and nums[low] <= pivotkey:
          low += 1
      nums[high] = nums[low]

  nums[low] = pivotkey
  return low

def QSort(nums, low, high):
  '''
  快速排序,递归
  :param nums:
  :param low:
  :param high:
  :return:
  '''
  if low < high:
      pivotloc = partition(nums, low, high)
      QSort(nums, low, pivotloc-1)
      QSort(nums, pivotloc + 1, high)
  return nums

冒泡排序

def bubbleSort(nums):
    '''
    冒泡排序,最坏情况下,时间复杂度位n2
    :param nums:
    :return:
    '''
    j = len(nums)
    while j > 1:
        no_exchange = True
        for i in range(j-1):
            if nums[i] > nums[i+1]:
                no_exchange = False
                temp = nums[i + 1]
                nums[i + 1] = nums[i]
                nums[i] = temp
        if no_exchange:
            break
        j -= 1
    return nums

简单选择排序

def selectSort(nums):
    '''
    时间复杂度为n2, 比较次数始终为n(n-1)/2
    一趟选择排序,将最小元素放在最前面,与冒泡排序相反
    一趟冒泡排序,将最大元素放在最后面
    :param nums:
    :return:
    '''
    for i in range(len(nums) - 1):
        curList = nums[i:]
        curMinIndex = curList.index(min(curList))
        if (curMinIndex + i) != i:
            temp = nums[curMinIndex+i]
            nums[curMinIndex+i] = nums[i]
            nums[i] = temp

    return nums
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为您介绍这几种排序算法。 1. 冒泡排序:它是一种简单的排序算法,通过不断交换相邻的元素来将序列排序。具体来说,它每次比较相邻的两个元素,如果顺序不对就交换它们的位置。重复这个过程直到所有元素都排好序为止。时间复杂度为 O(n^2)。 2. 直接插入排序:它是一种稳定的排序算法,它每次将一个排序的元素插入到已经排好序的序列。具体来说,它从第二个元素开始,将其插入到已经排好序的前面的序列。时间复杂度为 O(n^2)。 3. 折半插入排序:它是一种改进的直接插入排序算法,它通过二分查找的方式来寻找插入位置,从而减少了比较次数。具体来说,它将待排序的元素插入到已经排好序的序列,但是它是通过二分查找来寻找插入位置的。时间复杂度为 O(n^2)。 4. 简单选择排序:它是一种简单的排序算法,它每次选择一个最小的元素,并将其放到已经排好序的序列的末尾。具体来说,它从第一个元素开始,找到最小的元素并将其放到第一个位置,然后从剩余的元素找到最小的元素并将其放到第二个位置,以此类推。时间复杂度为 O(n^2)。 5. 快速排序:它是一种高效的排序算法,它通过分治的方式来将序列分成两个子序列,然后对这两个子序列分别进行排序。具体来说,它选择一个基准元素,将序列分成两个子序列,左边的子序列都比基准元素小,右边的子序列都比基准元素大。然后递归地对左右子序列进行快速排序。时间复杂度为 O(nlogn)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值