常见排序算法的python实现(一)

本文主要使用python实现了四种最基础的排序算法,分别是插入排序、希尔排序、冒泡排序和直接选择排序。

后续在(二)里会更新堆排序、归并排序等、快速排序等

一、插入排序

    插入排序是最简单的排序算法之一,插入排序由N-1趟排序组成。对于P=1到P=N-1趟,插入排序保证从位置0到位置P上的元素已为排序状态。简单来说就是依次将第2到最后一个元素作为待插入对象,倒序比较,直到找到合适的位置。

程序如下:

from numpy import random
import numpy as np

def insert_sort(list):
    len_of_list = len(list)
    for i in range(1, len_of_list):
        key = list[i]
        j = i - 1
        while j >= 0:
            if list[j] > key:
                list[j+1] = list[j]
                list[j] = key
            else:
                break  #若list[j]<=key,则结束循环,此时不需要继续和剩下的元素比较
            j = j - 1
    return list

二、希尔排序

    希尔排序名称源于它的发明者Donald Shell,该算法是第一批冲破二次时间屏障的第一批算法之一。它通过比较翔哥一定距离的元素来工作,各趟比较所用的距离随着算法的进行而缩小,直到比较相邻元素的最后一趟比较为止。希尔排序使用一个增量序列来确定每趟排序中比较的距离。但不同的增量序列排序性能有好有坏。增量序列的一种流行(但是不好)的选择是使用Shell建议的增量序列。

程序如下:

def shell_sort(list):
    len_of_list = len(list)
    step = 2
    group = len_of_list / step
    while group > 0:
        h = int(group)  #range函数要求h必须为整数,所以对group取整
        for i in range(0, h):
            j = i + h
            while j < len_of_list:
                k = j - h
                key = list[j]
                while k >= 0:
                    if list[k] >= key:
                        list[k+h] = list[k]
                        list[k] = key
                    k -= h
                j += h
        group /= 2
    return list

三、冒泡排序

    冒泡排序是最简单直接的排序算法,时间复杂度恒为O(N**2)。

程序如下:

def bubble_sort(list):
    len_of_list = len(list)
    for i in range(0, len_of_list-1):
        for j in range(i+1, len_of_list):
            if list[i] > list[j]:
                list[i], list[j] = list[j], list[i]  #若list[i] > list[j],则互换位置
    return list

四、直接选择排序

    直接选择排序的基本思想与冒泡排序较为相似,第一趟排序中选择最小的与第一个数交换位置,第二趟中在第2到N个中选择最小值与第二个交换位置,依次类推,直到最后一趟。

程序如下:

def select_sort(list):
    len_of_list = len(list)
    for i in range(0, len_of_list-1):
        min_index = i
        for j in range(i+1, len_of_list):
            if list[min_index] > list[j]:
                min_index = j
        list[i], list[min_index] = list[min_index], list[i]
    return list

产生待排序数组及测试:

random.seed(123456)
list = random.randint(-16, 16, size=16) #设置随机数种子,保证每次运行结果一致
print(list)
print(insert_sort(list))
print(bubble_sort(list))
print(shell_sort(list))
print(select_sort(list))

可以看到运行结果如下:

[-15  -6   2   1   8  -5  -1  -5  11 -16   7 -12  -8  -6  -6  -4]
[-16 -15 -12  -8  -6  -6  -6  -5  -5  -4  -1   1   2   7   8  11]
[-16 -15 -12  -8  -6  -6  -6  -5  -5  -4  -1   1   2   7   8  11]
[-16 -15 -12  -8  -6  -6  -6  -5  -5  -4  -1   1   2   7   8  11]
[-16 -15 -12  -8  -6  -6  -6  -5  -5  -4  -1   1   2   7   8  11]

猜你喜欢

转载自blog.csdn.net/zxd131248/article/details/80930466