携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情
也是暑假自学python的第14天
排序算法
排序算法在考研数据结构中是非常重要的的知识,在排序算法中,我首先学习冒泡排序,选择排序与插入排序,希尔排序,快速排序与堆排序。
其中冒泡排序较为简单,插入排序思想较为复杂,希尔排序就做一个算法上的思路了解。其他算法在学习中就是要清楚他们的排序思路能写出代码即可。
冒泡排序
冒泡排序的算法思想:
就是将第一个与后一个进行比较,小了位置就不动,如果大,则交换位置。
'''
冒泡排序
'''
def bubble(self):
i = self.n - 1
arr = self.arr
while i > 0: # i在控制无序数的数字(外层)
j = 0
while j < i:
if arr[j] > arr[j + 1]: # 小于的话就逆序排序
arr[j], arr[j + 1] = arr[j + 1], arr[j] # python的交换方式
j += 1
i -= 1
在算法中,i用来往后移动,控制无序数(未参加排序的数字),j用来比较
在python算法中,两个数字进行交换其写法较为简单:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
冒泡排序较为简单。
选择排序
选择排序的思路为设立一个外层j,从后向前进行移动。设立一个内层i,从前向后进行移动:
这就是i与j的含义,i向后移动,j向前移动。
选择排序的代码如下:
'''
选择排序
'''
def select_sort(self):
i = 0
arr = self.arr
while i < self.n - 1: # i控制无序数的数目
min_pos = i
j = i + 1
while j < self.n:
if arr[j] < arr[min_pos]:
min_pos = j
j += 1
arr[i], arr[min_pos] = arr[min_pos], arr[i]
i += 1
其中arr=self.arr可能看不懂,我将全部的代码贴在后面,就可以看懂了。这里是使用了init里面的变量。
插入排序
插入排序就是设立一个"哨兵",这个"哨兵"用来记住最小值,谁最小谁将值赋给他。i用来控制外层数字,j用来遍历内层数字,确定大小关系:
'''
插入排序
'''
def insort_sort(self):
arr=self.arr
i=1
while i<self.n:
insert_val=arr[i]
j=i-1
while j>=0:
if insert_val<arr[j]:
arr[j+1]=arr[j]
else:
break
j-=1
arr[j+1]=insert_val
i+=1
ps.插入排序我学的也不是太清楚,感觉思路懂了但是代码自己写还是不会写!以后回来要复习一下,再将原理补写到上面。
今天的学习结束。今天学习了三种算法,明天学习后面三种算法,其中希尔排序不重要,不管是学习或者工作中都不重要,我就不会学习他的算法了。希尔排序可能在考研的过程中计算机科目会考手动排序。
================================================================
这三种排序算法的总代码,含有main函数的我贴在下面,可以直接运行:
import random
class MySort:
def __init__(self, n, num_range):
self.n = n # 元素个数
self.num_range = num_range
self.arr = [random.randint(0, num_range - 1) for i in range(n)]
'''
冒泡排序
'''
def bubble(self):
i = self.n - 1
arr = self.arr
while i > 0: # i在控制无序数的数字(外层)
j = 0
while j < i:
if arr[j] > arr[j + 1]: # 小于的话就逆序排序
arr[j], arr[j + 1] = arr[j + 1], arr[j] # python的交换方式
j += 1
i -= 1
'''
选择排序
'''
def select_sort(self):
i = 0
arr = self.arr
while i < self.n - 1: # i控制无序数的数目
min_pos = i
j = i + 1
while j < self.n:
if arr[j] < arr[min_pos]:
min_pos = j
j += 1
arr[i], arr[min_pos] = arr[min_pos], arr[i]
i += 1
'''
插入排序
'''
def insort_sort(self):
arr=self.arr
i=1
while i<self.n:
insert_val=arr[i]
j=i-1
while j>=0:
if insert_val<arr[j]:
arr[j+1]=arr[j]
else:
break
j-=1
arr[j+1]=insert_val
i+=1
def test_sort(self, sort_method): # 传递一个方法
print(self.arr)
sort_method()
print(self.arr)
if __name__ == '__main__':
s = MySort(10, 99)
s.test_sort(s.bubble) #传递方法不要加括号
s.test_sort(s.select_sort)
s.test_sort(s.insort_sort)