排序算法python版本

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiaoyangwm/article/details/81807774

1、冒泡排序

# coding:utf-8


# 冒泡排序
# 1. 外层循环负责帮忙递减内存循环的次数【len-1, 1】
# 2. 内层循环负责前后两两比较, index 的取值范围【0, len-2】 len-1-i 次,求最大值放到最后
def bubble_sort(nums):
    # [1, len-1]
    for i in range(1, len(nums)-1):
        # [0, len-1-i]
        for j in range(len(nums)-i):  # j为列表下标
            if nums[j] > nums[j+1]:
                nums[j], nums[j+1] = nums[j+1], nums[j]
    return nums


if __name__ == "__main__":
    nums = [2, 6, 8, 5, 1, 4, 9, 3, 7]
    bubble_sort(nums)
    print('result:', nums)

2、插入排序

# coding:utf8
"""
插入排序和冒泡排序的区别在于:

插入排序的前提是:左边是有序的数列
而冒泡排序:相邻的值进行交换,一共进行n次交换
"""
from __future__ import print_function


def insert_sort(l):
    # 循环  除第一个数字组成的有序数组 以外的数字
    for i in range(1, len(l)):
        # 每一个数字,依次和有序数组进行比较
        print(l[:i])
        for j in range(len(l[:i])):
            if l[i] < l[j]:
                l[i], l[j] = l[j], l[i]


if __name__ == "__main__":
    l = [5, 1, 9, 3, 2, 7]
    print(l)
    insert_sort(l)
    print("result: " + str(l))

3、归并排序

# coding: utf-8


def MergeSort(nums):
    if len(nums) <= 1:
        return nums
    num = int(len(nums)/2)
    # 从中间,进行数据的拆分, 递归的返回数据进行迭代排序
    left = MergeSort(nums[:num])
    right = MergeSort(nums[num:])
    print("left: ", left)
    print("right: ", right)
    print("-" * 20)
    return Merge(left, right)


def Merge(left, right):
    l, r = 0, 0
    result = []
    while l < len(left) and r < len(right):
        if left[l] < right[r]:
            result.append(left[l])
            l += 1
        else:
            result.append(right[r])
            r += 1
    result += left[l:]
    result += right[r:]
    return result


if __name__ == "__main__":
    nums = [2, 6, 8, 5, 1, 4, 9, 3, 7]
    nums = MergeSort(nums)
    print('result:', nums)

4、快速排序

#!/usr/bin/python
# coding:utf8


def quick_sort(nums, start, end):
    i = start
    j = end
    # 结束排序
    if i >= j:
        return
    # 保存首个数值
    key = nums[i]
    # 一次排序,i和j的值不断的靠拢,然后最终停止,结束一次排序
    while i < j:
        # 和最右边的比较,如果>=key,然后j-1,慢慢的和前一个值比较;如果值<key,那么就交换位置
        while i < j and key <= nums[j]:
            print(key, nums[j], '*' * 30)
            j -= 1
        nums[i] = nums[j]
        # 交换位置后,然后在和最左边的值开始比较,如果<=key,然后i+1,慢慢的和后一个值比较;如果值>key,那么就交换位置
        while i < j and key >= nums[i]:
            print(key, nums[i], '*' * 30)
            i += 1
        nums[j] = nums[i]
    nums[i] = key
    # 左边排序
    quick_sort(nums, start, i-1)
    # 右边排序
    quick_sort(nums, i+1, end)


if __name__ == "__main__":
    nums = [2, 6, 8, 5, 1, 4, 9, 3, 7]
    quick_sort(nums, 0, len(nums) - 1)
    print('result:', nums)

5、基数排序

#************************基数排序****************************
#确定排序的次数
#排序的顺序跟序列中最大数的位数相关
def radix_sort_nums(L):
    maxNum = L[0]
#寻找序列中的最大数
    for x in L:
        if maxNum < x:
            maxNum = x
#确定序列中的最大元素的位数
    times = 0
    while (maxNum > 0):
        maxNum = int((maxNum/10))
        times += 1
    return times
#找到num从低到高第pos位的数据
def get_num_pos(num, pos):
    return (int((num/(10**(pos-1))))) % 10
#基数排序
def radix_sort(L):
    count = 10 * [None]       #存放各个桶的数据统计个数
    bucket = len(L) * [None]  #暂时存放排序结果
#从低位到高位依次执行循环
    for pos in range(1, radix_sort_nums(L)+1):
        #置空各个桶的数据统计
        for x in range(0, 10):
            count[x] = 0
        #统计当前该位(个位,十位,百位....)的元素数目
        for x in range(0, len(L)):
            #统计各个桶将要装进去的元素个数
            j = get_num_pos(int(L[x]), pos)
            count[j] += 1
        #count[i]表示第i个桶的右边界索引
        for x in range(1,10):
            count[x] += count[x-1]
        #将数据依次装入桶中
        for x in range(len(L)-1, -1, -1):
            #求出元素第K位的数字
            j = get_num_pos(L[x], pos)
            #放入对应的桶中,count[j]-1是第j个桶的右边界索引
            bucket[count[j]-1] = L[x]
            #对应桶的装入数据索引-1
            count[j] -= 1
        # 将已分配好的桶中数据再倒出来,此时已是对应当前位数有序的表
        for x in range(0, len(L)):
            L[x] = bucket[x]

6、选择排序

# coding:utf8
"""
选择排序和冒泡排序的区别在于:

选择排序的前提是:找到最大值的位置,最后才进行1次交换
而冒泡排序:相邻的值进行交换,一共进行n次交换
"""
from __future__ import print_function


def selection_sort(l):
    length = len(l) - 1

    while length:
        index = length
        # 第一个数字,和后面每一个数字进行对比,找出最大值,放到最后!!
        for j in range(length):
            if l[j] > l[index]:
                index = j
        l[length], l[index] = l[index], l[length]
        print(len(l) - length, l)
        length -= 1


if __name__ == "__main__":
    l = [5, 1, 9, 3, 2, 7]
    print(l)
    selection_sort(l)
    print("result: " + str(l))

7、希尔排序

# coding: utf8

from __future__ import print_function
def insert_sort(l, start, increment):
    for i in range(start+increment, len(l), increment):
        for j in range(start, len(l[:i]), increment):
            if l[i] < l[j]:
                l[i], l[j] = l[j], l[i]
    print(increment, '--',l)
    return l

def shell_sort(l, increment):
    # 依次进行分层
    while increment:
        # 每一层,都进行n次插入排序
        for i in range(0, increment):
            insert_sort(l, i, increment)
        increment -= 1
    return l

if __name__ == "__main__":
    l = [5, 2, 9, 8, 1, 10, 3, 4, 7]
    increment = len(l)/3+1 if len(l)%3 else len(l)/3
    print("开始", l)
    l = shell_sort(l, increment)
    print("结束", l)

猜你喜欢

转载自blog.csdn.net/jiaoyangwm/article/details/81807774
今日推荐