1.冒泡排序

思想: 依次循环遍历,没什么好说的,循环就完事了。每个数据都需要排列,i表示当前位置元素,第j个元素需要对比元素个数,n-1-i表示每行需要对比的最多次数,冒泡排序时间复杂度为O(n²)

def bubbleSort(list,n):

if n <= 1:

return list

for i in range(n): #表示行

flag = False #表示是否有数据交换

for j in range(n-1-i): #表示每行的下标

if list[j] > list[j+1]:

list[j],list[j+1] = list[j+1],list[j]

flag = True

if flag == False:

break

return list

list = [8,1,9,3,4,2,6,7]

n = len(list)

f = bubbleSort(list,n)

运行结果:

2.插入排序

思想:插入排序的工作方式就像许多人排列手中扑克牌一样。一般都是右手去拿桌子上的牌面向下的牌,然后从牌堆上拿走一张牌并将它插入左手中正确的位置. 为了找到这张牌的正确位置,一般都是将它与已在手中的每张牌进行比较,拿在左手中的牌总是排序好的. 时间复杂度为O(n²)

def insertSort(list,n):

if n <= 1:

return list

for i in range(1,n): #未排序区间

value = list[i]

for j in range(i,-1,-1): #排序过程

if value < list[j-1]: #如果value小于它前面的数。

list[j] = list[j-1] #就和它前面的数字换位置

else: #若没有,表示当前value为已排序区间最大值

break

list[j] = value

return list

list1 = [1,9,4,23,11,56,8,43,6,7]

print(list1)

n = len(list1)

a = insertSort(list1,n)

print(a)

运行结果:

3.选择排序:

思想:原理同插入排序。也分已拍区间和未拍区间,选择排序会从每次未排序的区间中找到最小元素,将其放到已排序区间末尾 选择排序刚开始没有已排序,找到最小元素,放到开始。或者末尾.时间复杂度为O(n²)

def selectionSort(list):

if len(list) <= 1:

return list

for i in range(len(list)-1):

min_index = i #记录最小位置

for j in range(i+1,len(list)):

if list[j] < list[min_index]:

min_index = j

if min_index != i:

list[i],list[min_index] = list[min_index],list[i]

return list

list1 = [1,9,4,23,11,56,8,43,6,7]

print(list1)

a = selectionSort(list1)

print(a)

运行结果:

4.归并排序:

思想:如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。 然后再将她们按照两个有序数组的样子合并起来。.时间复杂度为O(nlogn)

def merge(a, b): #接受两个列表

c = [] #定义了一个新列表

h = j = 0 #两个变量

while j < len(a) and h < len(b): #当j

if a[j] < b[h]: #如果a的j小于b的h,c添加a[j],j再+1

c.append(a[j])

j += 1

else:

c.append(b[h]) #反言之c添加b[h],h+1

h += 1

if j == len(a): #当j到a的末尾了

for i in b[h:]: #列表c添加列表b从h位到末尾的值

c.append(i)

else:

for i in a[j:]: #反之列表c添加列表a从j位到末尾的值

c.append(i)

return c

def merge_sort(lists):

if len(lists) <= 1:

return lists

middle = len(lists)//2 #将列表分成两份,放到merge中

left = merge_sort(lists[:middle])

right = merge_sort(lists[middle:])

return merge(left, right)

if __name__ == '__main__':

a = [14, 2, 34, 43, 21, 19]

print(a)

print (merge_sort(a))

运行结果:

5.快速排序:

思想:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。 时间复杂度:O(nlgn)

import random

def getrandata(num):

a = []

i = 0

while i

a.append(random.randint(0,100))

i += 1

return a

def quicksort(num_list):

lenth = len(num_list)

if lenth <= 1:

return num_list

temp = random.randint(0,lenth-1)# 随便取的一个数,作为列表索引

tempval = num_list[temp]

left = []

right = []

for i in range(0,lenth):

if num_list[i] > tempval:

right.append(num_list[i])

else:

left.append(num_list[i])

return quicksort(left)+quicksort(right)

if __name__ == '__main__':

a = getrandata(10)

print(a)

b = quicksort(a)

print(b)

运行结果:

希望能给后来学习的人一点启示。

查看原文 >>
相关文章