7种常用排序算法(python实现)

news/2024/5/17 16:16:17 标签: 排序算法, python, 快速排序, 归并排序, 堆排序

常用排序算法

0.导语

本节为手撕代码系列之第一弹,主要来手撕排序算法,主要包括以下几大排序算法

1.直接插入排序

算法思想

每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

代码实现

# 直接插入排序
def insert_sort(arr):
    length = len(arr)
    for i in range(length):
        k = i
        for j in range(k,0,-1):
            if arr[j]<arr[j-1]:
                t = arr[j]
                arr[j]=arr[j-1]
                arr[j-1]=t
arr = [4,3,0,-1]
insert_sort(arr)
print(arr)

2.冒泡排序

算法思想

对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序。

代码实现

# 冒泡排序
def bubbleSort(arr):
    length = len(arr)
    for i in range(length-1):
        flag = True
        for j in range(length-i-1):
            if arr[j]>arr[j+1]:
                t = arr[j]
                arr[j]=arr[j+1]
                arr[j+1]=t
                flag = False
        if flag:
            break
arr = [6,-2,0,9]
bubbleSort(arr)
print(arr)

3.选择排序

算法思想

每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止,简单选择排序是不稳定排序

代码实现

def selectSort(arr):
    length = len(arr)
    for i in range(length-1):
        min = i
        for j in range(i+1,length):
            if arr[min]>arr[j]:
                min=j
        if min!=i:
            t = arr[i]
            arr[i]=arr[min]
            arr[min]=t
arr = [6,-2,0,9]
selectSort(arr)
print(arr)

4.快速排序

算法思想

快速排序思想----分治法。

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

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

  • 再对左右区间重复第二步,直到各区间只有一个数。

每次划分得到,枢椎的左边比它小,右边比它大。

代码实现

def quickSort(arr,left,right):
    # 递归终止条件
    if left>right:
        return
    pivot = arr[left]
    i = left
    j = right
    while i<j:
        while i<j and arr[j]>=pivot:
            j-=1
        while i<j and arr[i]<=pivot:
            i+=1
        if i<j:
            t = arr[i]
            arr[i] = arr[j]
            arr[j] = t
    # 放入枢椎
    arr[left] = arr[i]
    arr[i]=pivot
    # 递归调用左区域
    quickSort(arr,left,i-1)
    # 递归调用右区域
    quickSort(arr,i+1,right)

arr = [6,-2,0,9]
quickSort(arr,0,len(arr)-1)
print(arr)

5.希尔排序

算法思想

该算法也被称为:缩小增量排序

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。

代码实现

# 希尔排序
def shellSort(arr):
    length =  len(arr)
    # 设置初始增量
    gap = length//2
    while gap>0:
        # 从第gap个元素,逐个对其所在组进行直接插入排序
        for i in range(gap,length):
            j = i
            while j-gap>=0 and arr[j]<arr[j-gap]:
                t = arr[j]
                arr[j] = arr[j-gap]
                arr[j-gap] = t
                j-=gap
        gap//=2
arr = [6,-2,0,9]
shellSort(arr)
print(arr)

6.堆排序

算法思想

堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

基本思路:

  a.将无需序列构建成一个堆,根据升序降序需求选择大顶堆或小顶堆;

  b.将堆顶元素与末尾元素交换,将最大元素"沉"到数组末端;(升序方法)

  c.重新调整结构,使其满足堆定义,然后继续交换堆顶元素与当前末尾元素,反复执行调整+交换步骤,直到整个序列有序。

 

堆的定义如下: n个元素的序列{k1, k2, ... , kn}当且仅当满足一下条件时,称之为堆。

                

可以将堆看做是一个完全二叉树。并且,每个结点的值都大于等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于等于其左右孩子结点的值,称为小顶堆。

堆排序(Heap Sort)是利用堆进行排序的方法。其基本思想为:将待排序列构造成一个大顶堆(或小顶堆),整个序列的最大值(或最小值)就是堆顶的根结点,将根节点的值和堆数组的末尾元素交换,此时末尾元素就是最大值(或最小值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次大值(或次小值),如此反复执行,最终得到一个有序序列。

代码实现

class HeapSort:
    def heapSort(self, nums):
        length = len(nums)
        # 从后往前遍历,交换堆顶与最后叶子节点,并依次调整堆,重复操作
        for j in range(length-1,0,-1):
            # 获取堆顶元素(获取同时,调整堆)
            firstNum = self.adjustHeap(nums,j+1)
            # 交换最后一个叶子节点与堆顶元素
            temp = nums[j]
            nums[j] = firstNum
            nums[0] = temp
        return nums
    # 调整堆(最大堆),每次返回最大堆顶元素
    def adjustHeap(self,nums,length):
        # 最后一个非叶节点
        i = length//2 -1
        # 从最后一个非叶节点开始调整,构成最大堆
        while i>=0:
            temp = nums[i]
            k = 2*i+1
            while k<length:
                if k+1<length and nums[k]<nums[k+1]:
                    k+=1
                if nums[k]>temp:
                    nums[i]=nums[k]
                    i=k
                else:
                    break
                k=2*k+1
            nums[i] = temp
            i-=1
        return nums[0]
s = HeapSort()
nums = [8,9,7,10]
t = s.heapSort(nums)
print(t)

7.归并排序

算法思想

归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

代码实现

def mergeSort(nums):
    if len(nums)<=1:
        return nums
    mid = len(nums)//2
    left = mergeSort(nums[:mid])
    right = mergeSort(nums[mid:])
    return merge(left,right)
def merge(left,right):
    result = []
    i,j = 0,0
    while i<len(left) and j<len(right):
        if left[i]<=right[j]:
            result.append(left[i])
            i+=1
        else:
            result.append(right[j])
            j+=1
    if i<len(left):
        result+=left[i:]
    if j<len(right):
        result+=right[j:]
    return result
nums = [5,3,0,6,1,4]
t = mergeSort(nums)
print(t)

 

转自公众号:

 

和:https://blog.csdn.net/liang_gu/article/details/80627548 


http://www.niftyadmin.cn/n/1400657.html

相关文章

java ssh 服务器文件传输_java使用SFTP上传文件到资源服务器

本文实例为大家分享了java实现SFTP上传文件到资源服务器工具类&#xff0c;供大家参考&#xff0c;具体内容如下首先得创建连接sftp服务器的公共类MySftp.java&#xff1a;package cn.test.util;import java.io.File;import java.io.FileInputStream;import java.io.FileOutput…

机器学习实战:kNN(k-近邻算法)

一、算法介绍 监督学习算法分类算法查找与已有数据中最接近的k个类别&#xff0c;分类为出现类别最大概率的类别 二、一般流程&#xff1a; 三、代码实现&#xff1a; python3中已经废弃iteritems()函数&#xff0c;使用会报错&#xff1a; 关键代码如下&#xff1a; def cla…

mysql经纬度存储格式geometry_MySQL的geometry类型处理经纬度距离的方法介绍

本篇文章给大家带来的内容是关于MySQL的geometry类型处理经纬度距离的方法介绍&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。建表CREATE TABLE map (id int(11) NOT NULL,address varchar(255) NOT NULL DEFAULT ,location…

机器学习实战:kNN示例1-使用k近邻算法改进约会网站的配对效果

目的&#xff1a;分类对象为&#xff1a; 1.不喜欢的人 not at all 2.魅力一般的人 in small doses 3.极具魅力的人 in large doses 1. kNN算法代码&#xff1a; def classify0(inX,dataSet,labels,k):dataSetSize dataSet.shape[0]diffMattile(inX,(dataSetSize,1))-data…

java多个物体动画_自已做动画及编写程序搞清楚最大堆的实现原理

背景二叉树是数据结构中的重点&#xff0c;也是难点。二叉树比数组、栈、队列等线性结构相比复杂度更高&#xff0c;想要做到心中有“树”&#xff0c;需要自己动手画图、观察、思考&#xff0c;才能领会其真谛。在上篇文章《自己动手作图深入理解二叉树、满二叉树及完全二叉树…

机器学习实战:kNN示例2:手写识别系统

所给的数据是已经使用图形处理&#xff0c;处理成32像素*32像素的黑白图像&#xff1a; 数据来源于github 代码用python3写 1. kNN算法核心&#xff1a; def classify0(inX,dataSet,labels,k):dataSetSize dataSet.shape[0]diffMattile(inX,(dataSetSize,1))-dataSetsqDiffMa…

php mysql 1040_CentOS下MySQL最大连接数设置 1040 too many connection

CentOS下MySQL最大连接数设置 1040 too many connectionCentOS下MySQL最大连接数设置 1040 too many connection当最大连接数比较小时&#xff0c;可能会出现“1040 too many connection”错误。可以通过修改配置文件来修改最大连接数&#xff0c;但我连配置文件在哪都不知道&a…

机器学习实战:决策树--ID3算法实现

一、决策树概念&#xff1a;本质是一棵树 结构分&#xff1a;【叶子节点&#xff08;预测结果&#xff09;】 和 【非叶子节点&#xff1a;内部节点&#xff08;划分属性----特征&#xff09;】 可以看做一个if-then规则的集合。我们从决策树的根结点到每一个都叶结点构建一条…