大数据,机器学习,人工智能机器学习与数据挖掘人工智能/模式识别/机器学习精华专题

Python3算法实例 2:排序算法示例+代码

2018-07-16  本文已影响32人  AiFany
pythonfan.png

1、插入排序

1.1 直接插入
 # 直接插入排序
 def Insert(listdata):
     for i in range(1, len(listdata)):
         # 设置当前值前一个元素的标识
         j = i - 1
         # 如果当前值小于前一个元素,则将当前值作为一个临时变量存储,将前一个元素后移一位
         if listdata[i] < listdata[j]:
             temp, listdata[i] = listdata[i], listdata[j]
             # 继续往前寻找,如果有比临时变量大的数字,则后移一位,直到找到比临时变量小的元素或者达到列表第一个元素
             j = j - 1
             while j >= 0 and listdata[j] > temp:
                 listdata[j + 1] = listdata[j]
                 j = j - 1
             # 将临时变量赋值给合适位置
             listdata[j + 1] = temp
     return listdata
1.2 希尔
# 希尔排序
def Shell(listdata):
    n = len(listdata)
    # 希尔增量
    gap = int(n / 2)
    while gap > 0:
        # 按增量进行直接插入排序
        for i in range(gap, n):
            j = i
            # 直接插入排序
            while j >= gap and listdata[j - gap] > listdata[j]:
                listdata[j - gap], listdata[j] = listdata[j], listdata[j - gap]
                j -= gap
        # 得到新的增量
        gap = int(gap / 2)
    return listdata
image

2、选择排序

2.1直接选择
# 直接选择排序
def Select(listdata):
    for i in range(len(listdata) - 1):
        minnum = i
        for j in range(i + 1, len(listdata)):
            if listdata[j] < listdata[minnum]:
                minnum = j
        listdata[i], listdata[minnum] = listdata[minnum], listdata[i]
    return listdata
2.2 堆

2,互换——生成最大堆 重复

image

排序结果{2, 7, 9, 13, 15}

 # 堆排序
 def adjust_heap(lists, i, size):
     lchild = 2 * i + 1
     rchild = 2 * i + 2
     max = i
     if i < size / 2:
         if lchild < size and lists[lchild] > lists[max]:
             max = lchild
         if rchild < size and lists[rchild] > lists[max]:
             max = rchild
         if max != i:
             lists[max], lists[i] = lists[i], lists[max]
             adjust_heap(lists, max, size)
 
 # 创建堆
 def build_heap(lists, size):
     for i in range(0, (int(size/2)))[::-1]:
         adjust_heap(lists, i, size)
 
 # 堆排序
 def Heap(lists):
     size = len(lists)
     build_heap(lists, size)
     for i in range(0, size)[::-1]:
         lists[0], lists[i] = lists[i], lists[0]
         adjust_heap(lists, 0, i)
     return lists
image

3、交换排序

3.1 冒泡

第1次两两比较8 > 6,需要交换(内循环):交换前状态{8,6,9,3}交换后状态{6,8,9,3}
第2次两两比较8 < 9,不需要交换(内循环):状态{6,8,9,3}
第3次两两比较9 > 3,需要交换(内循环):交换前状态{6,8,9,3}交换后状态{6,8,3,9}
结束比较

第二次遍历(外循环)

第1次两两比较6 < 8,不需要交换(内循环):状态{6,8,3,9}
第2次两两比较8 > 3,需要交换(内循环):交换前状态{6,8,3,9}交换后状态{6,3,8,9}
结束比较

第三次遍历(外循环)

第1次两两比较6 > 3,需要交换(内循环):交换前状态{6,3,8,9}交换后状态{3,6,8,9}
结束比较

第四次遍历(外循环)

无交换,结束内循环

结束外循环遍历,排序结束

# 冒泡排序
def Bubble(listdata):
    for i in range(len(listdata) - 1):  # 这个循环负责设置冒泡排序进行的次数
        for j in range(len(listdata) - i - 1):  # j为列表下标
            if listdata[j] > listdata[j + 1]:
                listdata[j], listdata[j + 1] = listdata[j + 1], listdata[j]
    return listdata
3. 2 快速

基准数=6,首先,用两个变量 i 和 j 从数组两边开始向中间扫描,i 向右走,j 往左走;
i 往右走,直到遇见不小于基准数的值停止移动 5。 j 向左走,直到遇见不大于基准数的值停止移动 2,交换两个值的位置 {4, 2, 3, 1, 7, 6, 5};
i,j继续移动,i停在1,j和i相遇,停止移动,1和基准数互换位置,{1, 2, 3, 4, 7, 6, 5};

第2次:

待排序数组: {1, 2, 3} 基准数1;{7, 6, 5} 基准数7。重复上面操作

# 快速排序
def Quick(listdata):
    if len(listdata) == 0:
        return []
    pivots = [x for x in listdata if x == listdata[0]]
    lesser = Quick([x for x in listdata if x < listdata[0]])
    greater = Quick([x for x in listdata if x > listdata[0]])
    return lesser + pivots + greater
image

4、归并排序

4. 1 归并


image


image
 # 归并排序
 def Merge(listdata):
     n = len(listdata)
 
     if n == 1:
         return listdata
     mid = n // 2
 
     # 对分割的左半部分进行归并排序
     leftdata = Merge(listdata[:mid])
     # 对分割的右半部分进行归并排序
     rightdata = Merge(listdata[mid:])

     # 对排序之后的两部分进行合并
     # 定义两个游标
     left, right = 0, 0
 
     merge_result_li = []
     left_n = len(leftdata)
     right_n = len(rightdata)
 
     while left < left_n and right < right_n:
         if leftdata[left] <= rightdata[right]:
             merge_result_li.append(leftdata[left])
             left += 1
         else:
             merge_result_li.append(rightdata[right])
             right += 1
 
     merge_result_li += leftdata[left:]
     merge_result_li += rightdata[right:]

     # 将合并后的结果返回
     return merge_result_li
image

5、分配排序

5. 1 基数
# 基数排序
def Radix(listdata):
    k = len(str(max(listdata)))  # k获取最大位数
    for k in range(k):  # 遍历位数,从低到高
        s = [[] for i in range(10)]  # 生成存放数的十个桶
        for i in listdata:  # 遍历元素
            s[i // (10 ** k) % 10].append(i)  # 分配
        listdata = [a for b in s for a in b]  # 收集
    return listdata
image

不同算法之间的对比:

pythonfan.png

点击获得生成上面图片的代码

image image

扫描下方二维码或者微信公众号直接搜索”Python范儿“,关注微信公众号pythonfan, 获取更多实例和代码。

pythonfan.jpg
上一篇 下一篇

猜你喜欢

热点阅读