常用的算法之 查找方法,冒泡,选择,快排,插入,堆排等八大排序和时间与空间复杂度等基础的合集

这篇博客详细介绍了常见的查找和排序算法,包括冒泡排序、选择排序、插入排序、快速排序、堆排序和归并排序。博主讨论了这些算法的时间复杂度,指出在最坏情况下快速排序的时间复杂度为O(n^2),而归并排序需要额外的内存空间。此外,还比较了快速排序、堆排序和归并排序的优劣,并探讨了排序算法的稳定性问题。
摘要由CSDN通过智能技术生成

目录:

1.1 常用查找方法

算法刷题网站: https://leetcode-cn.com/problemset/all/
  1、递归

  • 自己调用自己
  • 有结束条件

2、二分查找

l = list(range(1,101))
def bin_search(data_set,val):
   low = 0
   high = len(data_set) - 1
   while low <= high:
      mid = (low+high)//2
      if data_set[mid] == val:
         return mid
      elif data_set[mid] < val:
         low = mid + 1
      else:
         high = mid - 1
   return
n = bin_search(l,11)
print(n)            # 返回结果是: 10

1.2 列表排序常用方法介绍

1、常用排序方法

1、 性能最差的三个排序
   1) 冒泡排序
   2) 选择排序
   3) 插入排序
2、 快速排序
3、 排序NB二人组
   1) 堆排序
   2) 归并排序

2、时间复杂度

  • 循环减半的过程复杂度 O(logn)
  • 几次循环就是n的几次方的复杂度

3、排序方法比较

在这里插入图片描述

1.3 性能最差的三个排序

1、冒泡排序代码(最好是O(n), 最坏O(n2))

  • 原理:拿自己与上面一个比较,如果上面一个比自己小就将自己和上面一个调换位置,依次再与上面一个比较,第一轮结束后最上面那个一定是最大的数

冒泡排序:

import random
def bubble_sort(li):
   for i in range(len(li) - 1):
      exchange = False
      for j in range(len(li) - i -1):  #内层for循环执行一次,选出一个最大值,将可以调换位置的数调整
         if li[j] > li[j + 1]:
            li[j],li[j+1] = li[j+1],li[j]
            exchange = True
      if not exchange:                # 如果上一趟没有发生交换就证明已经排序完成
         break
data = list(range(100))
random.shuffle(data)                  #将有序列表打乱
bubble_sort(data)
print(data)

冒泡排序精简版:

#! /usr/bin/env pythonf
# -*- coding: utf-8 -*-
def bubble_sort(li):
    for i in range(len(li)-1):
        for j in range(len(li)-i-1):
            if li[j] > li[j+1]:
                li[j],li[j+1]=li[j+1],li[j]

li = [1,5,2,6,3,7,4,8,9,0]
bubble_sort(li)
print(li)               # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

2、选择排序

  • 先假定第一个是最小的,依次与其他数比,如果其他数中有比第一个数小就假定这个更小的最小
  • 再比,第一轮就可以找到最小的那个放到0号位置,然后在假定1号位置数最小与剩下比较,再找到第二小的数放到第1号位置

选择排序:

import random
def select_sort(li):
   for i in range(len(li) - 1):
      min_loc = i                #开始先假设0号位置的值最小
      for j in range(i+1, len(li)):      #循环无序区,依次比较,小于min_loc就暂定他的下标最小
         if li[j] < li[min_loc]:        #所以内层for循环每执行一次就选出一个小值
            min_loc = j
      li[i], li[min_loc] = li[min_loc],li[i]
data = list(range(100))
random.shuffle(data)        #将有序列表打乱
select_sort(data)
print
  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值