Python手撕排序算法

Python排序算法

  • 选择排序(升序):
      • 图解:
  • 冒泡排序(升序):
      • 图解:
  • 归并排序(升序):(分而治之)
      • 图解:

选择排序(升序):

每次在若干无序数据中查找最小数,放在无序数据的首位。

1.从N个元素的列表中找最小值及其下标,与第一个元素交换
2.从第二个元素开始的N-1个元素中找最小值及其下标,与第二个元素交换
3.以此类推,N-1轮后即为排好序的数据

图解:

Python手撕排序算法_第1张图片
算法实现:

a = [49,38,65,97,76,13,27,49]
for i in range(len(a)-1):
    m = i
    for j in range(i+1, len(a)):
        if a[j] < a[m]:
            m = j
    temp = a[i]
    a[i] = a[m]
    a[m] = temp

冒泡排序(升序):

第一轮比较:从第一个元素开始,按顺序对列表中所有N个元素中连续的两个元素进行
两两比较,如果两者不满足升序关系则交换。第一轮比较过后,最大数将下沉到列表最
后。
第二轮比较:从第一个元素开始,对列表中前N-1个元素进行两两比较,使次大数沉到
最后。
依此类推,N-1轮后,排序完毕

图解:

Python手撕排序算法_第2张图片

算法实现:

a=[77,42,35,12,101,5]
for i in range(len(a)-1):
    for j in range(len(a)-1-i):
        if a[j] > a[j+1]:
            a[j],a[j+1]=a[j+1],a[j]
print(a)

算法改进版:(某一轮比较中,一次交换也没有执行过,就说明已经排好序了)

a=[77,42,35,12,101,5]
for i in range(len(a)-1):
    flag = True
    for j in range(len(a)-1-i):
         if a[j] > a[j+1]:
             a[j],a[j+1]=a[j+1],a[j]
             flag = False
    if flag == True:
         break
print(a)

归并排序(升序):(分而治之)

1.将包含N个元素的列表拆分成两个含N/2个元素的子列表
2.对两个子列表递归调用归并排序(最后可以将整个列表分解为N个子列表)
3.合并两个已排好序的子列表

图解:

Python手撕排序算法_第3张图片
算法实现:

def merge(left, right): #合并两个列表
    merged = []
    i, j = 0, 0 #i和j分别作为left和right的下标
    left_len, right_len = len(left), len(right) #分别获取左右子列表的长度
    while i < left_len and j < right_len: #循环归并左右子列表元素
        if left[i] <= right[j]:
            merged.append(left[i]) #归并左子列表元素
            i += 1
        else:
            merged.append(right[j]) #归并右子列表元素
            j += 1
    merged.extend(left[i:]) #归并左子列表剩余元素
    merged.extend(right[j:]) #归并右子列表剩余元素
    print(left,right,merged) #跟踪调试
    return merged #返回归并好的列表
def mergeSort(a): #归并排序
    if len(a) <= 1: #空或者只有1个元素,直接返回列表
        return a
    mid = len(a) // 2 #列表中间位置
    left = mergeSort(a[:mid]) #归并排序左子列表
    right = mergeSort(a[mid:]) #归并排序右子列表
    return merge(left, right) #合并排好序的左右两个子列表
a = [98,23,45,14,6,67,33,42]
a1 = mergeSort(a)
print(a1)

输出结果:
Python手撕排序算法_第4张图片

Python列表自带有排序算法:

a = [98,23,45,14,6,67,33,42]
a.sort() #默认升序排序
print(a) #输出[6, 14, 23, 33, 42, 45, 67, 98]

a = [98,23,45,14,6,67,33,42]
a.sort(reverse=True) #降序排序
print(a) #输出[98, 67, 45, 42, 33, 23, 14, 6]

a = [98,23,45,14,6,67,33,42]
b = sorted(a) #降序采用sorted(a,reverse=True)
print(a) #输出[98, 23, 45, 14, 6, 67, 33, 42]不变
print(b) #输出[6, 14, 23, 33, 42, 45, 67, 98]

你可能感兴趣的:(列表,算法,排序算法,python,数据结构)