数据结构-几种O(n2)的排序算法

排序算法,选择排序,插入排序,冒泡排序,希尔排序

Posted by Hzy on November 23, 2019

今天总结了一下几种常用的O(n2)的排序算法

1. 选择排序

  • 选择排序。每次都从列表里选择一个最小或(最大)的数,进行排序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 选择排序,每次从准备排序的列表中,挑一个最小或(最大)的出来,慢慢的列表就空了。
def selectSort(l):
    for k ,v in enumerate(l):
        index= 0 # index用来记录 最小的数的下标
        smallNumber = float('inf')
        for i in range(k,len(l)):# 挑一个最小的数出来
            if l[i] < smallNumber:
                smallNumber = l[i]
                index= i
        # 更换,index和k下标上两者的值
        l[k],l[index] = smallNumber,l[k]
    return l

print(selectSort([54,26,93,17,77,31,44,55,20]))

2. 冒泡排序

  • 冒泡排序:从后往前或从前往后两两比较,将最小或者最大的数,像气泡一样,一个一个的移动到前面(后面)
1
2
3
4
5
6
7
8
9
10
11
12
# 冒泡排序 时间复杂度为 O(n2)
def  bubbleSort(l):
    for i in range(len(l)):
        for j in range(i+1,len(l)):
            if l[i]>l[j]:
                l[i],l[j] = l[j],l[i]
    return l




print(bubbleSort([3,4,5,2,1]))

3. 插入排序

  • 将未排序的列表中,依次取出元素,插入到已经排好序的列表中。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 插入排序,
def insertionSort(alist):
    for k , v in enumerate(alist): # v 是要插入的值
        index = k # 记录当前的下标
        while index >0  and alist[index-1] >v: ##从下标1开始插入,也就是第二个
            alist[index] = alist[index-1]
            index -=1 # 从后往前插入比较,看是否更合适的插入点
        alist[index] = v # 插入


# 插入2的时候的比较
# 34521
# 34551
# 34451
# 33451
# 23451 alist[0] = 2

# 插入1 的时候的比较
# 23451
# 23455
# 23445
# 23345
# 22345
# 12345


print(insertionSort([3,4,5,2,1]))

4. 希尔排序

  • 在插入排序的基础上,将列表分组,缩小插入的次数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 希尔排序
def shellSort(l):
    subListCount  = len(l)//2 # 设定的增量
    while subListCount >0:
        # 分组
        for i in range(subListCount):
            # 组内部进行插入排序
            gapInsertionSort(l,i,subListCount)
        subListCount //=2
    return l
# 这就是一个插入排序,只是列表不在是连续的了,而是有了间隔
def gapInsertionSort(l,start,gap):
    # 循环组,这里间隔gap得到一个组
    for i in range(start,len(l),gap):
        index = i
        value = l[i]

        while  index+1 >gap and l[index-gap] >value:
            l[index] = l[index - gap]
            index -=gap
        l[index] = value


print(shellSort([5,3,2,1,4]))