本文主要使用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]