10大排序方法,其中这里只介绍前7种(第4种C语言,其它C++语言)

news2024/11/16 9:39:04

排序方法有十种,分别是:一、冒泡排序;二、选择排序;三、插入排序;四、希尔排序;五、归并排序;六、快速排序;七、堆排序;八、计数排序;九、桶排序;十、基数排序。

一、冒泡排序

冒泡排序是排序算法中较为简单的一种,英文称为Bubble Sort。它遍历所有的数据,每次对相邻元素进行两两比较,如果顺序和预先规定的顺序不一致,则进行位置交换;这样一次遍历会将最大或最小的数据上浮到顶端,之后再重复同样的操作,直到所有的数据有序。

void bubbleSort(int arr[], int n) {
    for (int i = 0; i < n - 1; i++)
        for (int j = 0; j < n - i - 1; j++)
            if (arr[j] > arr[j + 1])
                swap(arr[j], arr[j + 1]);
}

二、选择排序

选择排序简单直观,英文称为Selection Sort,先在数据中找出最大或最小的元素,放到序列的起始;然后再从余下的数据中继续寻找最大或最小的元素,依次放到排序序列中,直到所有数据样本排序完成。

void selectionSort(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        int min_idx = i;
        for (int j = i; j < n; j++)
            if (arr[j] < arr[min_idx])
                min_idx = j;
        swap(arr[min_idx], arr[i]);
    }
}

三、插入排序

插入排序英文称为Insertion Sort,它通过构建有序序列,对于未排序的数据序列,在已排序序列中从后向前扫描,找到相应的位置并插入,类似打扑克牌时的码牌。插入排序有一种优化的算法,可以进行拆半插入。

基本思路是先将待排序序列的第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列;然后从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置,直到所有数据都完成排序;如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。

void insertionSort(int arr[], int n) {
    for (int i = 1; i < n; i++) {
        int key = arr[i];
        int j = i - 1;
 
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j];
            j = j - 1;
        }
        arr[j + 1] = key;
    }
}

四、希尔排序

希尔排序也称递减增量排序,是插入排序的一种改进版本,英文称为Shell Sort,效率虽高,但它是一种不稳定的排序算法。

插入排序在对几乎已经排好序的数据操作时,效果是非常好的;但是插入排序每次只能移动一位数据,因此插入排序效率比较低。

希尔排序在插入排序的基础上进行了改进,它的基本思路是先将整个数据序列分割成若干子序列分别进行直接插入排序,待整个序列中的记录基本有序时,再对全部数据进行依次直接插入排序。

void shell_sort(int* a,int len){
    int  i,j;
    int gap=0;
    int temp=0,k;
    for(int gap=len/2;gap>0;gap/=2){
        for(i=0;i<gap;i++){
            for(j=i+gap;j<len;i+=gap){
                temp=a[j];
                k=j-gap;
                while(k>=0&&a[k]>temp){
                    a[k+gap]=a[k];
                    k-=gap;
                }
                a[k+gap]=temp;
            }
        }
    }
}

五、归并排序

归并排序英文称为Merge Sort,归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。它首先将数据样本拆分为两个子数据样本, 并分别对它们排序, 最后再将两个子数据样本合并在一起; 拆分后的两个子数据样本序列, 再继续递归的拆分为更小的子数据样本序列, 再分别进行排序, 直到最后数据序列为1,而不再拆分,此时即完成对数据样本的最终排序。

归并排序严格遵循从左到右或从右到左的顺序合并子数据序列, 它不会改变相同数据之间的相对顺序, 因此归并排序是一种稳定的排序算法.

作为一种典型的分而治之思想的算法应用,归并排序的实现分为两种方法:

1、自上而下的递归;

2、自下而上的迭代;

void merge(int arr[], int l, int m, int r) {
    int i, j, k;
    int n1 = m - l;
    int n2 = r - m;
    int L[n1], R[n2];
 
    for (i = 0; i < n1; i++)
        L[i] = arr[l + i];
    for (j = 0; j < n2; j++)
        R[j] = arr[m + j];
 
    i = 0;
    j = 0;
    k = l;
    while (i < n1 && j < n2) {
        if (L[i] <= R[j]) {
            arr[k] = L[i];
            i++;
        }
        else {
            arr[k] = R[j];
            j++;
        }
        k++;
    }
 
    while (i < n1) {
        arr[k] = L[i];
        i++;
        k++;
    }
 
    while (j < n2) {
        arr[k] = R[j];
        j++;
        k++;
    }
}
 
void mergeSort(int arr[], int l, int r) {
    if (l < r) {
        int m = l + (r - l) / 2;
 
        mergeSort(arr, l, m);
        mergeSort(arr, m + 1, r);
 
        merge(arr, l, m + 1, r);
    }
}

六、快速排序

快速排序,英文称为Quicksort,又称划分交换排序 partition-exchange sort 简称快排。

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为两个子序列(sub-lists)。首先从数列中挑出一个元素,并将这个元素称为「基准」,英文pivot。重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。之后,在子序列中继续重复这个方法,直到最后整个数据序列排序完成。

int partition(int arr[], int low, int high) {
    int pivot = arr[high];
    int i = (low - 1);
 
    for (int j = low; j <= high - 1; j++) {
        if (arr[j] < pivot) {
            i++;
            swap(arr[i], arr[j]);
        }
    }
    swap(arr[i + 1], arr[high]);
    return (i + 1);
}
 
void quickSort(int arr[], int low, int high) {
    if (low < high) {
        int pi = partition(arr, low, high);
 
        quickSort(arr, low, pi - 1);
        quickSort(arr, pi + 1, high);
    }
}

七、堆排序

堆排序,英文称Heapsort,是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序实现分为两种方法:

1、大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;

2、小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;

void heapify(int arr[], int n, int i) {
    int largest = i;
    int l = 2 * i + 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1658583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1011: 二叉排序树的实现和查找

解法&#xff1a; 二叉排序树&#xff08;Binary Search Tree&#xff0c;简称BST&#xff09;也被称为二叉搜索树或二叉查找树&#xff0c;是一种重要的二叉树结构&#xff0c;它具有以下性质&#xff1a; 左子树上所有节点的值都小于根节点的值&#xff1b;右子树上所有节点的…

2024粤港澳青少年信息学创新大赛C++知识点汇总和真题训练

2024粤港澳青少年信息学创新大赛C知识点汇总和真题训练 知识汇总 真题训练 程序设计语言C是一种解释性语言。 A.正确 B.错误 Python是一种编译型语言。 A.正确 B.错误 误 RAM&#xff08;随机存取存储器&#xff09;是一种易失性存储设备。 A.正确 B.错误 Java…

单节锂电池充电芯片H4054无需外接检测电阻500mA电流7V输入

锂电池充电芯片的主要功能如下&#xff1a; 充电管理功能&#xff1a;充电芯片能够对锂电池进行智能化管理&#xff0c;根据电池的状态和需求&#xff0c;调节充电电流和电压&#xff0c;以实现快速充电、恒流充电、恒压充电等不同的充电模式。通过合理控制充电过程&#xff0…

Selenium定位方法汇总及举例

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

头歌实践教学平台:CG1-v2.0-直线绘制

第1关&#xff1a;直线光栅化-DDA画线算法 一.任务描述 1.本关任务 (1)根据直线DDA算法补全line函数&#xff0c;其中直线斜率0<k<1&#xff1b; (2)当直线方程恰好经过P(x,y)和T(x,y1)的中点M时&#xff0c;统一选取直线上方的T点为显示的像素点。 2.输入 (1)直线两…

接口用例设计方法

一、单接口测试 例如&#xff1a;登录、获取天气等等 1、正向测试&#xff08;也就是正确测试&#xff0c;比如&#xff1a;登录成功&#xff09; 1.必填参数组合 P0 (正确用户名和正确的密码) 2.必填非必填组合 1)全部参数组合 P1 2)其他参数组合 P2/P3 2、…

16【PS Aseprite 作图】图像从Aseprite传输到PS

【内容背景】Aseprite很适合做像素图&#xff0c;有一个“完美像素”的选项&#xff0c;就不用在PS里面慢慢修线&#xff0c;能够省事很多 【具体操作】 勾选完美像素 Aseprite里面的“完美像素”能够减少修线的步骤&#xff0c;在“作图”的时候一定要注意勾选 导出 选择…

Java17 --- SpringCloud之Zipkin链路追踪

目录 一、下载zipkin及运行 二、在父工程中引入pom依赖 三、在子工程8001引入相关pom依赖 3.1、修改yml配置文件 3.2、测试代码 四、在子工程80引入相关pom依赖 4.1、修改yml配置文件 4.2、测试代码 五、测试结果 一、下载zipkin及运行 运行控制台访问地址&#xff1…

LLM大语言模型(十四):LangChain中Tool的不同定义方式,对prompt的影响

背景 ChatGLM3-6B的函数调用功能&#xff0c;和LangChain的Tool调用&#xff0c;在prompt上并没有对齐。 参考&#xff1a;LLM大语言模型&#xff08;十二&#xff09;&#xff1a;关于ChatGLM3-6B不兼容Langchain 的Function Call_error: valueerror: caught exception: unk…

AI编码工具-通义灵码功能实测(二)

AI编码工具-通义灵码功能实测&#xff08;二&#xff09; 通义灵码智能问答 在上一篇文章中&#xff1a;https://blog.csdn.net/csdn565973850/article/details/138563670?spm1001.2014.3001.5501 讲述了通义灵码的7大应用场景&#xff0c;这里在使用过程中遇到了一些问题&…

如何向Linux内核提交开源补丁?

2021年&#xff0c;我曾经在openEuler社区上看到一项改进Linux内核工具的需求&#xff0c;因此参与过Linux内核社区的开源贡献。贡献开源社区的流程都可以在内核社区文档中找到&#xff0c;但是&#xff0c;单独学习需要一个较长的过程&#xff0c;新手难以入门&#xff0c;因此…

springboot+vue+mybatis警情高发智能灯箱+PPT+论文+讲解+售后

时代在飞速进步&#xff0c;每个行业都在努力发展现在先进技术&#xff0c;通过这些先进的技术来提高自己的水平和优势&#xff0c;警情高发智能灯箱当然不能排除在外。警情高发智能灯箱是在实际应用和软件工程的开发原理之上&#xff0c;运用微信开发者、java语言以及SpringBo…

超标量处理器设计:寄存器重命名(1)介绍

★继续学习体系结构的知识。 指令之间的相关性 1.数据相关性 具体分为三类&#xff1a; (1) Output Dependence (WAW)&#xff1a;当两条指令尝试向同一个寄存器写入数据时发生。后面的写操作必须等待前面的写操作完成&#xff0c;因为它们争夺同一资源。 (2) Anti-Depende…

大厂面试sql手撕题目总结

文章目录 1. 常用函数1. 日期函数 2. 行转列&#xff08;转置&#xff09;1. 行转列 连续N天登录1. 查询出连续三天登录的人员姓名 N日留存率1. 求用户当天&#xff0c;次日&#xff0c;七日留存率 分组内topN1. 求出每个部门工资最高的前三名员工&#xff0c;并计算这些员工的…

AWS Cli Windows安装配置

1. 安装 下载地址&#xff1a;AWS 命令行界面(CLI)_管理AWS服务的统一工具-AWS云服务 检验安装&#xff1a; > aws --version aws-cli/2.15.44 Python/3.11.8 Windows/10 exe/AMD64 prompt/off 2. 创建IAM用户 1) 创建组 选择IAM 点击创建组 填写用户组名&#xff0c;…

YOLOv5改进 | 独家创新篇 | 利用MobileNetV4的UIB模块二次创新C3(全网独家首发)

一、本文介绍 本文给大家带来的改进机制是利用MobileNetV4的UIB模块二次创新C3&#xff0c;其中UIB模块来自2024.5月发布的MobileNetV4网络&#xff0c;其是一种高度优化的神经网络架构&#xff0c;专为移动设备设计。它最新的改动总结主要有两点&#xff0c;采用了通用反向瓶…

synchronized关键字和ReentrantLock锁区别

synchronized关键字和ReentrantLock锁是Java中用于同步的两个重要机制&#xff0c;它们在很多方面有所不同&#xff1a; 1. **锁定范围**: synchronized关键字只能在方法的执行过程中提供锁定&#xff0c;而ReentrantLock可以锁定任何对象&#xff0c;包括方法、代码块和对象。…

django项目结构介绍

小白的django学习笔记 五一前的某天 文章目录 django项目结构介绍项目的基本配置templates项目模块manage.pyExternal Libraries django项目结构介绍 项目的基本配置 在这里配置&#xff0c;跟工程名是一样的 templates 放网页、js、css的地方 django 项目模块 项目开发时&…

Android Studio高版本安卓模拟器抓取https包

Android Studio avd 设置 证书生成 *.cer格式证书​ openssl x509 -inform DER -subject\_hash\_old -in charles-ssl-proxying-certificate.cer​ *.pem格式证书​ openssl x509 -inform PEM -subject\_hash\_old -in charles-ssl-proxying-certificate.pem会输出 2cb30a9e …

QX------mini51单片机学习------(5)数码管的静态与动态显示

目录 1数码管应用场景 2数码管显示原理 3静态与动态显示 474HC573锁存器工作原理 5上拉电阻的作用 6原理图分析 7实践 1数码管应用场景 2数码管显示原理 图&#xff08;b&#xff09;左边是共阴极&#xff0c;右边是共阳极 GND是公共极&#xff0c;可以用万用表测&am…