算法中常用的几种排序方式

1.什么叫算法

算法:可以理解为是解决问题方法的一个计算过程。

2.时间复杂度

用来评估算法运行效率的一个东西。时间复杂度常用大O符号表述,如O(1)。

n = 10
print('Hello World')    # 时间复杂度:O(1)
----------------------------------------------------------------
for i in range(n):
    print('Hello World')    # 时间复杂度:O(n)
----------------------------------------------------------------
for i in range(n):
    for j in range(n):
        print('Hello World')    # 时间复杂度:O(n^2)
----------------------------------------------------------------
for i in range(n):
    print('Hello World') 
    for j in range(n):
        print('Hello World')    # 时间复杂度:O(n^2)
----------------------------------------------------------------
for i in range(n):
    for j in range(m):
        print('Hello World')    # 时间复杂度:O(n^2)
----------------------------------------------------------------
for i in range(n):
    for j in range(n):
        for k in range(n):
            print('Hello World')    # 时间复杂度:O(n^3)
----------------------------------------------------------------
print('Hello Yesterday')
print('Hello Tomorrow')
print('Hello Today')     # 时间复杂度:O(1)

注意:如果快速判断出时间复杂度?

  1.循坏减半的过程---->O(logn)

  2.有几次循环,时间复杂度就是n的几次方。

3.空间复杂度

用来评估算法内存占用大小的一个式子。

1.冒泡排序法

思路:① 列表每两个相邻的数,如果前边的数比后边的数大,那=那么就换两个数的位置。

def Bubble_sort(li):
    for i in range(len(li) - 1):
        for j in range(len(li) - 1 - i):
            if li[j] > li[j+1]:  # 判断前面一个数字是否大于后面的数字
                li[j], li[j+1] = li[j+1], li[j]   # 转换两数字之间的位置,将大的数字放后面


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

2.选择排序法

思路:① 先把列表中所有数走一趟,记录下最小的数并放置的第一个位置。

   ② 再把列表中剩余的数遍历走一趟,记录下最小的数,继续放置。

def select_sort(li):
    for i in range(len(li)):
        minIndex = i   # 记录最小数的索引
        for j in range(i+1,len(li)):
            if li[j] < li[minIndex]:  # 判断两个索引代表数的大小
                minIndex = j 
        if i != minIndex:  # 当i不是最小索引时,将i和最小索引进行交换
            li[i], li[minIndex] = li[minIndex],li[i]

3.插入排序法

思路:① 将列表被分为有序区和无序区。最开始的有序区只有首位元素。

   ② 每次从无序区抽取一个元素插入到有序区的位置,并对其进行大小比较及排序,直至有序区变空。

def insert_sort(li):
    for i in range(1, len(li)):    # 以第二个作为无序代码的开端
        tmp = li[i]    # 索引 i 对应的值
        j = i - 1    # 索引 J 为索引 i 的前一位索引
        while j >= 0 and tmp < li[j]:    # 判断索引 i 和索引 J 对应值的大小
            li[j + 1] = li[j]
            j = j - 1
        li[j + 1] = tmp


li = [4, 1, 7, 2, 5, 8, 3, 6, 9, 10]
insert_sort(li)
print(li)

4.快速排序法

思路:① 取一个元素P(一般取第一个元素),使元素P归位。

   ② 列表被P分为两部分,左边都比P小,右边都比P大。

   ③ 递归完成剩余的排序。

def quick_sort(li, left, right):
    if left < right:
        mid = partition(li, left, right)
        quick_sort(li, left, mid-1)
        quick_sort(li, mid + 1, right)

def partition(li, left, right):
    tmp = li[left]
    while left < right :    # left, right 代表的是索引大小
        while left < right and li[right] >= tmp:
            right -= 1
        li[left] = li[right]
        while left < right and li[left] <= tmp:
            left += 1
        li[right] = li[left]
    li[left] = tmp
    return left


li = [4,1,7,2,5,8,3,6,9]
quick_sort(li, 0, len(li)-1)    # 如果不减一,索引会超
print(li)
原文地址:https://www.cnblogs.com/blue-tea/p/12219602.html