首页 > 编程语言 >排序算法基本思想及实现

排序算法基本思想及实现

时间:2022-09-21 16:45:59浏览次数:63  
标签:sort 思想 元素 lst 算法 放置 序列 排序

一、插入排序

1、直接插入排序

    基本思想:类似抓扑克牌,待排序元素在已排序的序列中从后往前遍历,遇到小于他的元素向后移一位,直至遇到小于或等于他的元素,在其后插入即可

2、希尔排序(是对直接插入排序的一种改进)

二、交换排序

  1、冒泡排序

    基本思想:相邻的两个元素进行两两比较,如果出现逆序,则小的元素向前移动

    代码实现:

      

 1 def bubble_sort(lst):
 2     """冒泡排序"""
 3     n = len(lst)
 4     for i in range(n):
 5         for j in range(1, n-i):
 6             if not lst[j-1] > lst[j]:
 7                 # print("{}小于{},无需替换".format(lst[j-1], lst[j]))
 8                 continue
 9             lst[j-1], lst[j] = lst[j], lst[j-1]
10 
11     return lst

  2、快速排序(是对冒泡排序的一种改进)

    基本思想:找到一个基准元素,比其小的元素放置左边,反之不小于他的元素放置右边,由此分成左右两个区间,对左右两个区间进行递归,重复以上操作,最终形成有序序列

    代码实现:

1 def quick_sort(lst):
2     """快速排序"""
3     n = len(lst)
4     if n <= 1:
5         return lst
6     baseline = lst[0]
7     left = [lst[i] for i in range(1, len(lst)) if lst[i] < baseline]
8     right = [lst[i] for i in range(1, len(lst)) if lst[i] >= baseline]
9     return quick_sort(left) + [baseline] + quick_sort(right)

 

三、选择排序

  1、直接选择排序

    基本思想:从待排序记录中找到最小或最大的元素,放置起始位置,然后再从剩下的序列中找到最值,放置在已排序的序列末尾,直至待排序记录为空

    代码实现:

1 def select_sort(lst):
2     """直接选择排序"""
3     for i in range(len(lst)):
4         res = min(lst)
5         yield res
6         lst.remove(res)

  2、堆排序

    基本思想:堆是python中一种基本的数据结构,heapq[0]永远是序列中最小的元素

    代码实现:

1 def select_sort(lst):
2     """堆排序"""
3     heapq.heapify(lst)
4     for i in range(len(lst)):
5         yield heapq.heappop(lst)

四、归并排序

  1、二路归并排序

    基本思想:先拆再合:带有N个元素的待排序序列分成N个子序列 ,相邻的序列进行两两合并,在合并的过程中,较小的元素放置左边,较大的元素放置右边

以上总结仅代表个人理解,可能存在不足,还请批评指正

标签:sort,思想,元素,lst,算法,放置,序列,排序
From: https://www.cnblogs.com/shixiaogu/p/16716138.html

相关文章

  • 排序算法动画演示
    本文由简悦SimpRead转码,原文地址blog.csdn.net一、直接插入排序(StraightInsertionSorting)把新的数据插入到已经排好的数据列中。将第一个数和第二个数排序,......
  • 算法-动态规划(DP)
     时间:2022/09/21 一.引入-斐波那契数列下图展示了斐波那契数列数列的递归式:然后我们再看一下在计算fib(7)的时候会出现什么问题:如上图所示,在计算fib(7)的时候......
  • Problem P14. [算法课动态规划]连续数组最大和
    感觉很简单的一道题,curnum存下连续数组和大于0的数值,maxnum存下最大连续数组和,curnum从数组头开始,遍历数组,+=数组值,当curnum大于0时,那么即便紧接着的后面有一个很大的......
  • 数据结构算法(一)之二分查找
    internalclassProgram{staticvoidMain(string[]args){varn=50;varrandom=newRandom();while......
  • 目标检测YOLO系列算法的进化史
    本文中将简单总结YOLO的发展历史,YOLO是计算机视觉领域中著名的模型之一,与其他的分类方法,例如R-CNN不同,R-CNN将检测结果分为两部分求解:物体类别(分类问题),物体位置即bounding......
  • letcode算法--15. 删除有序数组中的重复项
    给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。由于在某些语言中不能改......
  • JS/TS算法---回溯算法
    回溯算法(backtracking)、什么是回溯法回溯法也可以叫做回溯搜索法,它是一种搜索的方式。在二叉树系列中,我们已经不止一次,提到了回溯,例如二叉树:以为使用了递归,其实还隐藏......
  • 排序方法(C++ 、递归方法)
    1#include<iostream>2#include<vector>3usingnamespacestd;45vector<int>sort(intn,vector<int>inputs,intp){6intmin=inputs[p],pos......
  • 【学习笔记】匈牙利算法
    【图论】二分图最大匹配——匈牙利算法二分图相当好理解这是百度百科的定义二分图又称作二部图,是图论中的一种特殊模型。设G=(V,E)是一个无向图,如果顶点V可分割为两......
  • Java无难事:详解Java编程核心思想与技术 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1Ht352zrCXy9ArE-Th9fgNg点击这里获取提取码 ......