算法学习(六)

本文详细介绍了五种基础排序算法:快速排序、归并排序、插入排序、冒泡排序和选择排序。通过理解这些排序算法的原理,你可以更好地掌握数据处理的核心技巧。快速排序通过选取基准数并分区实现高效排序;归并排序利用二分法不断合并有序数组;插入排序模拟扑克牌插入操作保持有序;冒泡排序通过相邻元素比较交换确保顺序;选择排序则在每轮找出最小元素放于起始位置。掌握这些排序算法对于提升编程能力至关重要。
摘要由CSDN通过智能技术生成

学习内容:

排序算法:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法

学习产出:

了解排序算法原理(快速排序、归并排序、插入排序、冒泡排序、选择排序)及排序算法的变种

快速排序

1.先从数列中取出一个数作为基准数。
2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。
3.再对左右区间重复第二步,直到各区间只有一个数。


def quick_sort(nums: list, l: int, r: int) -> list: #l: 0 起始位置; r : len(nums)-1 末尾位置
    """快速排序"""
    if l + 1 >= r: return #递归结束标志
    first = l #序列左边在开始位置的由左向右移动的游标
    last = r-1 #序列右边末尾位置的由右向左移动的游标
    key = nums[first] #设定起始的基准元素
    while first < last:
    	while first < last and nums[last] >=key: # 如果first 与last 未重合,last (右边)指向的元素大于等于基准元素,则last 向左移动
    		last -= 1
    	nums[first] = nums[last] #走到此位置时last指向一个比基准元素小的元素,将last指向的元素放到first的位置上,此时last指向的位置空着,接下来移动first找到符合条件的元素放在此处
    	while first < last and nums[first] <= key:  #如果first与last未重合,first指向的元素比基准元素小,则first向右移动
    		first += 1
    	nums[last] = nums[first] # 此时first指向一个比基准元素大的元素,将first指向的元素放到last空着的位置上,此时first指向的位置空着,之后进行下一次循环,将last找到符合条件的元素填到此处
    
    # 退出循环后,first与last重合,此时所指位置为基准元素的正确位置,左边的元素都比基准元素小,右边的元素都比基准元素大
	nums[first] = key  # 将基准元素放到该位置
    #对基准元素左边的子序列进行快速排序
    quick_sort(nums,l,first)  # l:0  first-1 原基准元素靠左边一位
    # 对基准元素右边的子序列进行快速排序
    quick_sort(nums,first+1,r)  #first+1 : 原基准元素靠右一位  r: 最后
    

归并排序

首先归并排序使用了二分法。给定一个数组,将其不停的分为左边和右边两份,然后以此递归分下去。然后再将她们按照两个有序数组的样子合并起来。

def merge_sort(nums: list, l: int, r: int, temp:list) -> list:
 """归并排序"""
    if l + 1 >= r: return #递归结束标志
    # 切分
    mid = l + (r - 1)//2
    merge_sort(nums,l,mid,temp)
    merge_sort(nums,mid,r,temp)
    #合并
    p,q,i = l,mid,l
    while p < m or q < r:
    	if q >= r or (p < m and nums[p] <= nums[q]):
    		temp[i] = nums[p]
    		i+=1
    		p+=1
    	else:
    		temp[i] = nums[q]
    		i+=1
    		q+=1
    for i in range(l,r):
    	nums[i] = temp[i]

插入排序

插入排序的思想和我们打扑克摸牌的时候一样,从牌堆里一张一张摸起来的牌都是乱序的,我们会把摸起来的牌插入到左手中合适的位置,让左手中的牌时刻保持一个有序的状态。


def insert_sort(self, nums: list) -> list:
 """插入排序"""
	  for i in range(1, len(nums)): 
			key = nums[i]  
        	for j in range(1,i+1)[::-1]:  
	            if j>0 and key < nums[j-1]:  
                	nums[j] = nums[j-1]  
                	nums[j-1] = key  
      return param  

冒泡排序

冒泡排序就是遍历数据,每次只与下一个数字比较,如果这两个数顺序不对,则与交换过来。

def bublle_sort(nums: list) -> list:
    """冒泡排序"""
    n = len(nums)
    for j in range(n-1):
        count = 0
        for i in range(0, n-1-j):
            #从头走到尾
            if nums[i]>nums[i+1]:
                nums[i],nums[i+1] = nums[i+1],nums[i]
                count +=1
        if 0 == count:
            break
    return nums
            

选择排序

选择排序是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置。

def selection_sort(nums: list) -> list:
    """选择排序"""
    # 第一层for表示循环选择的遍数
    for i in range(len(nums) - 1):
        # 将起始元素设为最小元素
        min_index = i
        # 第二层for表示最小元素和后面的元素逐个比较
        for j in range(i + 1, len(nums)):
            if nums[j] < arr[min_index]:
                # 如果当前元素比最小元素小,则把当前元素角标记为最小元素角标
                min_index = j
        # 查找一遍后将最小元素与起始元素互换
        nums[min_index], nums[i] = nums[i], nums[min_index]
    return arr
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值