python实现四种排序逻辑与代码

参考链接:https://blog.csdn.net/u010786109/article/details/41911401 

1、冒泡排序

原理:对一组数据,比较相邻数据的大小,将值小数据放在前面,值大的数据放在后面。

比较结论:对于一个长度为N的数组,我们需要排序 N-1 轮,每 i 轮 要比较 N-i 次。对此我们可以用双重循环语句,外层循环控制循环轮次,内层循环控制每轮的比较次数。

实现代码:

 

2、快速排序

原理:

步骤

    1. 获得待排序数组a
    2. 选取一个合适的数字p(一般来说就选取数组或是子数组的第一个元素)作为排序基准
    3. 将待排序数组a中比基准p小的放在p的左边,比基准p大的放在p的右边 
    4. 从第3步获得的两个子数组sub1跟sub2
    5. 判断sub1或sub2中是否只有一个元素,如果只有一个元素则返回此元素,否则就将sub1(或是sub2)代回到第1步中继续执行
    6. 具体过程可以参见下面的过程

实现代码:

 

# coding:utf-8
# 冒泡排序实现
def bubbleSort(data):
    if len(data) < 2:
        return data
    else:
        for i in range(0, len(data) - 1):
            m = i
            for j in range(i + 1, len(data)):
                if data[m] > data[j]:
                    m = j
            if m != i:
                # 不使用中间元素,下面语句直接完成两个数组元素交换
                data[i], data[m] = data[m], data[i]
        return data


# 插入排序实现
def insertSort(data):
    if len(data) < 2: return data
    for i in range(1, len(data)):
        key = data[i]
        j = i - 1
        while j >= 0 and key < data[j]:
            data[j + 1] = data[j]
            j = j - 1
        data[j + 1] = key
    return data


# 快速排序实现
def partition(data, p, r):
    i = p - 1
    cmp = data[r]
    for j in range(p, r):
        if data[j] < cmp:
            i = i + 1
            if i <> j: data[i], data[j] = data[j], data[i]

    if (i + 1) <> r: data[i + 1], data[r] = data[r], data[i + 1]
    return i + 1


def randomPartition(data, p, r):
    import random
    i = random.randint(p, r)
    data[i], data[r] = data[r], data[i]
    return partition(data, p, r)


def quickSort(data, p, r):
    if p < r:
        # q = partition(data, p, r)
        q = randomPartition(data, p, r)
        quickSort(data, p, q - 1)
        quickSort(data, q + 1, r)


# 归并排序
from heapq import merge
def merge_sort(m):
    if len(m) <= 1:
        return m

    middle = len(m) / 2
    left = m[:middle]
    right = m[middle:]

    left = merge_sort(left)
    right = merge_sort(right)
    return list(merge(left, right)

# 创建一个100个元素的数组,每次用shuffle打乱之后再排序
from random import shuffle, sample
numbers = sample(range(10), 9)

shuffle(numbers)
print numbers
print 'after sorted:'
insertSort(numbers)
print numbers

#冒泡排序
shuffle(numbers)
print numbers
print 'after sorted:'
bubbleSort(numbers)
print numbers

shuffle(numbers)
print numbers
print 'after sorted:'
quickSort(numbers, 0, len(numbers) - 1)
print numbers

shuffle(numbers)
print numbers
print 'after sorted:'
numbers = merge_sort(numbers)
print numbers

 

posted @ 2020-05-19 09:54  小嘉欣  阅读(582)  评论(0编辑  收藏  举报