#-*-coding:utf-8-*-
#冒泡排序
#工作原理:冒泡排序通过依次交换相邻两个顺序不合法的元素位置,从而将当前最小(大)元素放到合适的位置;
#时间复杂度:为O(n2)----貌似按照最差情况计算时间复杂度,也就是逆序的情况下进行正序排序
def bubble(list):
for i in range(0,len(list)-1): #需要比较的次数,因为最后一各数字不用再比较,所以次数是长度减1
flag = False
for j in range(0,len(list)-1-i): #每一轮比较结束后,待比较的长度减1
if list[j] > list[j+1]:
list[j],list[j+1] = list[j+1],list[j]
flag = True
if flag == False: #当上一次排序没有交换,说明已经排好序了,不用再循环比较了;
return list
return list
#简单选择排序
#工作原理: 一趟遍历选择最小的数放在第一位,再进行下一次遍历直到最后一个元素
# 简单选择排序法(Simple Selection Sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1≤i≤n)个记录交换之。
#时间复杂度:为O(n2),但简单选择排序的性能上还是要略优于冒泡排序
def selectionSort(list):
for i in range(len(list)-1): #因为最后一个值就没有再后面比较的元素了,所以减1
min = i #假设起始位置为最小值
for j in range(i+1,len(list)): #最小值与第i+1及以后的元素做比较,
if list[min] > list[j]: #如果有比list[min]小的值,就交换两者的下标,每一轮j循环后,找到一个最小值
min = j
if min <> i: #若min不等于i,说明找到最小值,交换;如果相等,说明排序完毕,不用再交换了,再交换就乱套了,所以要判断min和i是否相等;
list[min],list[j] = list[j],list[min] #交换设定最小值与实际最小值的位置,每一次i循环交换一次,
# i值往后移动(也就是min的位置往后移动),开始寻找次小及其他更小的值;
print list
#直接插入排序
#工作原理:将列表分为有序区和无序区,最开始的有序区只有一个元素,每次从无序区选择一个元素按大小插到有序区中
# 从无序区中取到的值分别于有序区比较,并且从有序区的最后面的值开始比,如果小,插入到前面
#时间复杂度:为O(n2),但比冒泡和简单选择排序的性能要好一些
def insertSort(list):
for i in range(1,len(list)): #因为range(0,1)返回的值[0],所以这里是range(1,len(list));而且最后一个值也是无序区中的值,需要跟前面的做比较
temp = list[i] #list[0]为初始有序区,从无序区顺次取值比较,list[1]为无序区第一个值
for j in range(i-1,-1,-1): #从有序区最大值开始遍历,也就是有序区从后面的值依次往前比较;最后的值最大(因为是有序区啊)
if list[j]>temp: #如果待插入的无序区的值小于有序区的值
list[j+1] = list[j] #有序区的值向后挪一位
list[j] = temp #将无序区的值temp放进去,插入到正确的位置
print list
#快速排序
#工作原理:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,
# 则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的
#时间复杂度:
def partition(list,low,high): #计算枢轴值pivot的位置,使它之前(后)位置的元素不大于(小于)它
mid = (low+high)/2
if list[low] > list[high]:
list[high],list[low] = list[low],list[high]
if list[mid] > list[high]:
list[high],list[mid] = list[mid],list[high]
if list[low] < list[mid]:
list[low],list[mid] = list[mid],list[low]
pivotkey = list[low] #选低位、高位、中间位上的三个数,选择不大不小的那个数并放到低位,作为中轴数
while low < high: #从表的两端交替地向中间扫描
while (low < high) and (list[high] >= pivotkey):
high -=1
list[low],list[high] = list[high],list[low] #将比枢轴记录小的记录交换到低端
while (low < high) and (list[low] <= pivotkey):
low +=1
list[high],list[low] = list[low],list[high] #将比枢轴记录大的记录交换到高端
return low #返回枢轴所在位置
#/对顺序表list中的子序列作快速排序
def qsort(list,low,high):
if low < high:
pivot = partition(list,low,high) #将list列表一分为二,算出枢轴值pivot
qsort(list,low,pivot-1) #对低子表递归排序
qsort(list,pivot+1,high) #对高子表递归排序
def quickSort(list):
qsort(list,0,len(list)-1)
return list
#快速排序2
def QuickSort(myList,start,end):
#判断low是否小于high,如果为false,直接返回
if start < end:
i,j = start,end
#设置基准数
base = myList[i]
# 从表的两端交替向中间扫描
while i < j:
#如果列表后边的数,比基准数大或相等,则前移一位直到有比基准数小的数出现
while (i < j) and (myList[j] >= base):
j = j - 1
#如找到,则把第j个元素赋值给第i个元素,此时表中i,j个元素相等
myList[i] = myList[j]
#同样的方式比较前半区
while (i < j) and (myList[i] <= base):
i = i + 1
myList[j] = myList[i]
#做完第一轮比较之后,列表被分成了两个半区,并且i=j,需要将这个数设置回base
myList[i] = base
#递归前后半区
QuickSort(myList, start, i - 1)
QuickSort(myList, j + 1, end)
return myList
if __name__ == "__main__":
list = [50,10,90,30,70,40,80,60,20]
# print bubble(list)
# selectionSort(list)
# insertSort(list)
print QuickSort(list,0,len(list)-1)
#print quickSort(list)