python版本的各种排序算法,其中除了归并排序有点问题之外,其他的都经过测试的!!!
#coding=utf8
import os
import sys
import numpy as np
# 显示
def show(list):
if len(list) == 0 :
print("list中没有元素")
return 0
print(list)
# 交换数据
def swap(list,i,j):
if len(list) == 0:
print("list中没有元素")
return 0
temp = list[i]
list[i] = list[j]
list[j] = temp
# 选则排序---> 核心:选择最小的数据
def select_sort(list):
if len(list) == 0:
print("列表的内容为空")
index = 0
while index < len(list):
min = index
select = index + 1
while select < len(list):
if list[min] > list[select]:
min = select
select += 1
swap(list,index,min)
index += 1
return list
# 冒泡排序 ---> 核心:两两比较,小的向上冒,或者两两比较,大的向下沉
def bubble(list):
if len(list) == 0:
print("列表的内容为空")
index = 0
while index < len(list):
select = len(list) - 1
while select > index:
if list[select] < list[select - 1]:
swap(list,select,select-1)
select -= 1
index += 1
return list
# 插入排序 ---> 核心: 选择插入点,把数据取出来,和前面比较插入到合适的位置
def insert(list):
if len(list) == 0:
print("列表的内容为空")
# 选择插入点数据
index = 1
while index < len(list):
insert = list[index]
# 从index位置开始向前搜索,选择合适的插入位置
select = index - 1
while select >= 0:
if list[select] > insert:
# swap(list,select,select+1)
list[select + 1] = list[select]
select -= 1
else:
break
# 插入到合适的位置,在 list[select] < insert的时候执行,也就是select刚好插入到 select+1 的位置
list[select+1] = insert
index += 1
return list
# 以上三种排序算法,选择排序、冒泡排序、插入排序都是复杂度比较高的排序算法---O(n^2)
# 快速排序和归并排序的复杂度---O(nlogn)
# 快速排序,一种递归的思想,核心思想-->找基准点,分块-->分成子列表(不断的重复着基准点,分块,直到子列表的长度为1就说明这个列表已经排好序了)
# 基准和划分的使用,保证每一次划分--对于基准点的右边都会比基准点大,对于基准点左边都会比基准点小
"""
快排的一些重要性能: (1)快排是一种不稳定的排序算法
(2)快排的时间复杂度:最好的情况-->O(nlogn)
最坏的情况-->O(n^2)
(3)快排的空间复杂度:快排是一个递归的排序算法,每一次递归都需要一个固定大小的栈空间,对于列表的每一次分割都会有两次递归
调用,所以快排的空间复杂度:最好的情况-->O(log2(n))
最坏的情况-->O(n)
(4)对于基准的选取也会对算法产生性能上的改变,以下我将以第一个元素为基准来实现一个递归快排
"""
# 对于交换和显示部分的代码上面已经给出
# 快排实现1
# 进行1次划分,此时 left=right ,此时left就是基准的位置 --> 基准点左边的数据都比基准点小,基准点右边的数据都比基准点大
def onceQuickSort(list,left,right):
temp = list[left]
while left < right:
while (left < right) and (temp <= list[right]):
right -= 1
swap(list,left,right)
while (left < right) and (temp >= list[left]):
left += 1
swap(list,left,right)
list[left] = temp
# 此时left和right应该是重合的
return left
# 对子序列进行递归操作,直到子列表的元素是1就表示列表已经排好序了
def Qsort(list,left,right):
if left < right :
# povit已经是排好位置的,所以在前在后操作
povit = onceQuickSort(list,left,right)
Qsort(list,left,povit-1)
Qsort(list,povit+1,right)
#总的函数,调用快排,list是可变类型
def QuickSort(list):
Qsort(list,0,len(list)-1)
return list
# 快排比较好理解
# 现在介绍另一种排序---> 归并排序 也叫合并排序算法 利用递归、分而治之
"""
归并排序的性能:(1)时间复杂度: O(nlog(n))
(2)空间复杂度: 合并排序有两个空间需求(1)支持递归调用的调用栈需要O(log(n))
(2)复制缓存需要O(n)
"""
def merge(list,copylist,low,middle,high):
i = low
j = middle + 1
k = low
while (i <= middle) and (j <= high):
if list[i] <= list[j]:
copylist[k] = list[i]
k += 1
i += 1
else:
copylist[k] = list[j]
k += 1
j += 1
# 保证左右序列的长度在不相等的情况下的排序问题
while i <= middle:
copylist[k] = list[i]
i += 1
k += 1
while j <= high:
copylist[k] = list[j]
j += 1
k += 1
# 划分列表
def MergeSortClip(list,copylist,left,right):
if left < right:
middle = (left+right)//2
MergeSortClip(list,copylist,left,middle)
MergeSortClip(list,copylist,middle+1,right)
# 算法部分
merge(list,copylist,left,middle,right)
# 用户调用函数
def MergeSortDisplay(list):
copyBuffer = [None] * len(list)
print(copyBuffer)
print(type(copyBuffer))
MergeSortClip(list,copyBuffer,0,len(list)-1)
if __name__ == '__main__':
a = [12,3,41,34,6,78,2354,12,34,1,56,0,35]
list_num = select_sort(a)
show(list_num)
b = [12, 3, 41, 34, 6, 78, 2354, 12, 34, 1, 56, 0, 35]
list_bu = bubble(b)
show(list_bu)
c = [12, 3, 41, 34, 6, 78, 2354, 12, 34, 1, 56, 0, 35]
list_in = insert(c)
show(list_in)
d = [12, 3, 41, 34, 6, 78, 2354, 12, 34, 1, 56, 0, 35]
list_q = QuickSort(d)
show(list_q)
e = [12,3,41,34,6,78,2354,12,34,1,56,0,35]
list_qk = QuickSort(e)
show(list_qk)
# 均好使用
# 归并排序
f = [12,34,2,1,45,567,213,12,34,345,45,56]
list_reg = MergeSortDisplay(f)
print(list_reg)
# show(list_reg)