记录从准研一假期自学PYTHON的全过程day14(冒泡排序 选择排序 插入排序)

87 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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,从前向后进行移动:

image.png

这就是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)