python算法 之 排序

注:

算法演示工具: https://algorithm-visualizer.org/

参考:https://www.runoob.com/python3/python3-examples.html

参考:《算法图解》

环境: Visual Code Python2.7

 

冒泡排序

简介:对n个数据操作n-1轮,每轮中对元素进行比对,找出最大(最小)的值。

时间:O(n^2)

图示:

示例:

import sys

def bubbleSort(arr):
    n = len(arr)
    for i in range(0,n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]

if __name__ == '__main__':
    arr = [-5,10,8,6,0,5]
    print(u'排序前的数组:{}'.format(arr))
    bubbleSort(arr)
    print(u'排序后的数组:{}'.format(arr))

 

选择排序

简介:从未排序的序列中找到最小(最大)元素,存放到新序列中。然后再从剩下未排序的序列中继续查找,直到末尾。

时间: O(n^2)

图示:

 

 示例:

# -*- coding:UTF-8 -*-
#!/usr/bin/env python
import sys

# 查找最小原色
def FindSmallest(arr):
    smallest = arr[0]           # 默认最小值
    smallIndex = 0              # 默认最小值索引

    for i in range(1,len(arr)):
        if arr[i] < smallest:
            smallest = arr[i]
            smallIndex = i 
    
    return smallIndex

# 选择排序
def SelectSort(arr):
    newArr = []
    for i in range(len(arr)):
        print(u'--> 查找序列:{0}'.format(arr))
        # 查找数组中最小元素索引
        smallIndex = FindSmallest(arr)
        # 原有数组移除指定值
        smallValue = arr.pop(smallIndex)
        # 将值放置到新列表中
        newArr.append(smallValue)

    return newArr


if __name__ == '__main__':
    arr = [-5,10,8,6,0,5]
    print(u'未排序序列:{0}'.format(arr))
    newArr = SelectSort(arr)
    print(u'已排序序列:{0}'.format(newArr))


'''
未排序序列:[-5, 10, 8, 6, 0, 5]
--> 查找序列:[-5, 10, 8, 6, 0, 5]
--> 查找序列:[10, 8, 6, 0, 5]
--> 查找序列:[10, 8, 6, 5]
--> 查找序列:[10, 8, 6]
--> 查找序列:[10, 8]
--> 查找序列:[10]
已排序序列:[-5, 0, 5, 6, 8, 10]
'''

快速排序

简介:采用D&C(divide and conquer)分而治之方法,一种著名的递归式问题解决方法。

思想:

1.  从数列中取出一个数作为基准值

2. 分区,将数列中比基准值大的数放置在右边区间,比基准值小的数放在左边区间

3. 重复执行1,2步,直到左右区间各剩下一个数。

时间: O(N*logN)

def quickSort(arr):
    # 数组为空或者仅有一个元素,无需排序
    if len(arr) < 2:
        return arr 

    # 基准值
    pivot = arr[0]
    # 小于基准值元素组成的数列
    lessArr = [i for i in arr[1:] if i <= pivot]
    # 大于基准值元素组成的数列
    greatArr = [i for i in arr[1:] if i > pivot]

    print(pivot, lessArr, greatArr)
    return quickSort(lessArr) + [pivot] + quickSort(greatArr)

if __name__ == '__main__':
    arr = [-5,10,8,16,0,20,1,4,-10,-7,-8]
    print(u'排序前的数组:{}'.format(arr))
    newArr = quickSort(arr)
    print(u'排序后的数组:{}'.format(newArr))

'''
排序前的数组:[-5, 10, 8, 16, 0, 20, 1, 4, -10, -7, -8]
(-5, [-10, -7, -8], [10, 8, 16, 0, 20, 1, 4])
(-10, [], [-7, -8])
(-7, [-8], [])
(10, [8, 0, 1, 4], [16, 20])
(8, [0, 1, 4], [])
(0, [], [1, 4])
(1, [], [4])
(16, [], [20])
排序后的数组:[-10, -8, -7, -5, 0, 1, 4, 8, 10, 16, 20]
'''

 

posted @ 2019-12-05 15:31  Code~  阅读(233)  评论(0)    收藏  举报