冒泡排序,快速排序,选择排序详细过程

2023-10-27

一.冒泡排序

1基本思想: 相邻的两个数之间进行比较,按照规则进行交换。

2.实现思路:

(以升序排列为例) 第一趟比较: 先用第一个和第二个元素进行比较,将较大的交换到第二个位置上, 然后第二个和第三个进行比较,将较大的放在第三个位置上。。。 依次类推,第一趟比较结束时,最大的元素就在最后一个位置上了 然后进行第二趟比较: 先用第一个和第二个元素进行比较,将较大的交换到第二个位置上, 然后第二个和第三个进行比较,将较大的放在第三个位置上。。。 依次类推,由于第一趟比较已经将最大放在最后一个位置了 所以第二趟可以少比较一个元素,第二趟结束时, 第二大的元素就放在了倒数第二个位置上 依次类推,直到最后一趟比较完成,整个数组排序完成。 (最后一趟时,只剩下一个元素了,可以不参与比较)

3.实现动态图

 4代码实现

#include <stdio.h>

 int main(int argc, const char *argv[])
{
    int s[10] = {23,45,65,78,90,55,33,17,96,54};
    int i = 0;
    int j = 0;
    int temp = 0;
    int flags=0;//设置这个是为了提高效率
    int len = sizeof(s)/sizeof(int);

    for(i = 0; i < len; i++){
    printf("%d ", s[i]);
    }

    printf("\n");

    for(j = 0; j < len-1; j++){
        flags=0;
        for(i = 0; i < len-1-j; i++){
            if(s[i] > s[i+1]){
                temp = s[i];
                s[i] = s[i+1];
                s[i+1] = temp;
                flags=1;
            }
        }
        if(flags==0){
             break;
         }        
    }

    for(i = 0; i < len; i++){
        printf("%d ", s[i]);
    }

    printf("\n");

    return 0;
 }

二.快速排序

 1概念

快速排序是冒泡排序的优化,也是一种基于交换的排序方式。

时间复杂度 O(nlogn)。

2 基本思想

分而治之通过一趟排序,先将数据分成两部分,其中一部分的数据,都比另一部分的数据大(小),(每部分数据内部不要求有序)然后,对于两部分数据分别进行上述的排序操作,把没部分数据再分成两部分,依次类推,直到整个数据有序。

3实现动态图

4代码实现

#include <stdio.h>
#include <unistd.h>

int sort(int *num,int low,int high)
{
    int flag=num[low];

    while(low<high){
        while(num[high]>flag&&low<high){
            high--;
        }

        if(low<high){
            num[low]=num[high];
        }

        while(num[low]<flag&&low<high){
            low++;
        }

        if(low<high){
            num[high]=num[low];
            high--;
        }
    }

    num[low]=flag;

    return low;
}

int quick_sort(int *num,int low,int high)
{
    if(low<high){
        int ret=sort(num,low,high);
        quick_sort(num,0,ret-1);
        quick_sort(num,ret+1,high);
    }
}


int show_num(int *num)
{
    for(int i=0;i<10;i++){
        printf("%d ",num[i]);
    }

    puts("");
}


int main(int argc, char const *argv[])
{
    int num[10]={3,4,12,65,31,52,34,76,6,10};

    show_num(num);

    quick_sort(num,0,9);

    show_num(num);
    return 0;
}

三.选择排序

3.1基本思想

3.2代码实现

#include <stdio.h>
#include <stdlib.h>

void choose_sort(int *arr)
{   
    if (NULL == arr){
        printf("传参错误\n");
        exit(-1);
    }

    int i;
    int j;
    int max = 0;
    int temp;

    for (i = 0; i < 7; i++){
        max = i;
        for (j = i + 1; j < 8; j++){
            if (arr[j] > arr[max]) max = j;
        }

        if (max != i){
            temp = arr[max];
            arr[max] = arr[i];
            arr[i] = temp;
        }
    }

    return;
}

int main(int argc, char const *argv[])
{
    int arr[8] = {8, 12, 28, 3, 53, 22, 0, 7};

    choose_sort(arr);


    for (int i = 0; i < 8; i ++){
        printf("%d ", arr[i]);
    }

    puts("");
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

冒泡排序,快速排序,选择排序详细过程 的相关文章

  • IIS应用程序池回收+quartz调度

    我正在 IIS 7 5 上运行一个 Web 应用程序 它需要偶尔回收 否则内存使用情况会失控 这是我正在研究的问题 当它回收时 它实际上不会运行 直到另一个请求到来 而quartz不会运行 有没有办法让IIS在回收应用程序池后立即自动启动1
  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • 从代码中,如何创建对存储在附加属性中的对象的属性的绑定?

    我们有一个继承的附加属性来存储一个对象 在可视化树的更下方 我们希望从代码绑定到该对象的属性 通常我们像这样构建绑定的路径部分 var someBinding new Binding Path new PropertyPath Attach
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • 将表(行)与 OpenXML SDK 2.5 保持在一起

    我想在 Word 文档中生成多个表 每行 2 行 但我想将这两行保留在一起 如果可能的话 new KeepNext 第一行不起作用 new KeepNext 第一行的最后一段不起作用 new CantSplit 放在桌子上不起作用 在所有情
  • 使用 LINQ 更新 IEnumerable 对象的简单方法

    假设我有一个这样的业务对象 class Employee public string name public int id public string desgination public int grade List
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 根据对象变量搜索对象列表

    我有一个对象列表 这些对象具有三个变量 ID 名称和值 这个列表中可能有很多对象 我需要根据ID或Name找到一个对象 并更改值 例子 class objec public string Name public int UID public
  • 如何对 NServiceBus.Configure.WithWeb() 进行单元测试?

    我正在构建一个 WCF 服务 该服务接收外部 IP 上的请求并将其转换为通过 NServiceBus 发送的消息 我的单元测试之一调用Global Application Start 它执行应用程序的配置 然后尝试将 Web 服务解析为 验
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • Mockito框架@Mock, @InjectMocks注解使用

    最近写项目Junit 使用Junit4框架 测试的数据都要依赖数据库 而好多接口需要调其他的系统 junit4框架完全无法实现测试功能 大佬推荐用Mockito框架 这篇博客用来记录学习Mockito的使用方法 不足欢迎指点 Mock In
  • Dump文件的生成和使用

    1 简介 第一次遇到程序崩溃的问题 之前为单位开发了一个插件程序 在本机运行没有出现问题 但把生成的可执行文件拷贝到服务器上一运行程序 刚进入插件代码 插件服务就崩溃了 当时被这个问题整的很惨 在同事的帮助下了解到 对于程序崩溃 最快的解决
  • qemu图形界面linux,QEMU 简单几步搭建一个虚拟的ARM开发板

    1 安装QEMU 先在Ubuntu中安装QEMU sudo apt get install qemu 1 安装几个QEMU需要的软件包 sudo apt get install zlib1g dev sudo apt get install
  • 在Windows中使用WSL和VS Code搭建出友好的终端开发环境

    使用WSL Windows Subsystem for Linux 这一适用于 Linux 的 Windows 子系统可让开发人员按原样运行 GNU Linux 环境 包括大多数命令行工具 实用工具和应用程序 且不会产生传统虚拟机或双启动设
  • 平面几何-python

    三角形面积 题目描述 平面直角坐标系中有一个三角形 请你求出它的面积 输入描述 第一行输入一个 TT 代表测试数据量 每组测试数据输入有三行 每行一个实数坐标 x y x y 代表三角形三个顶点 1 T 10 3 10 5 x y 10 5
  • 2018年LeetCode高频算法面试题刷题笔记——验证回文串(字符串)

    1 解答之前的碎碎念 这个题还蛮简单的 大概就是考研机试第一题的水平 所以就不写解法了 2 问题描述 给定一个字符串 验证它是否是回文串 只考虑字母和数字字符 可以忽略字母的大小写 说明 本题中 我们将空字符串定义为有效的回文串 示例 1
  • 自媒体账号ID应该怎么取?

    我们都知道 在做自媒体之前 我们需要注册自媒体账号 这时候我们需要给账号取一个名称 一个好的名称能让你吸取更多的粉丝 让读者记忆深刻 取名规范各平台的规则都差不多 所以在入驻平台之前一定要先认真看清各平台名称规范 防止因为名称不规范而不能通
  • 鹏仔暴力刷导航网页排行榜HTML模板,网站如何测压

    现在很多站长都做了导航站 大多数导航站都有网站排行榜 也就是今日浏览榜 月最高浏览榜 总浏览榜等 你页面阅读量越高 那么排名越靠前 曝光的几率就更高 很多站长在某些导航站提交完收录后 手动刷新增加阅读量 真的特别慢 那么本次鹏仔就给大家简单
  • 头文件路径包含问题

    头文件包含两种 系统头文件和自定义头文件 系统头文件不说了 格式统一 自定义头文件在包含的时候要注意路径 其实是头文件与主文件的相对位置关系的问题 ps 另外 LInux和Windows下也有所区别 举4个例子 应该就能看明白了 一 这种情
  • InnoSetup 脚本打包及管理员权限设置

    InnoSetup使用教程 InnoSetup打包安装 脚本详细 1 定义变量 1 define MyAppName TranslationTool 2 define MyAppChineseName 翻译工具 3 define MyApp
  • ios系统下input边框有默认阴影

    修复代码 1 input outline none webkit appearance none 去除系统默认的样式 webkit tap highlight color rgba 0 0 0 0 点击高亮的颜色 2 input appea
  • 深度学习实战11(进阶版)-BERT模型的微调应用-文本分类案例

    文章目录 一 前期工作 导入库包 导入数据 二 模型加载三 模型训练 四 模型测试 大家好 我是微学AI 今天给大家带来一个基于BERT模型做文本分类的实战案例 在BERT模型基础上做微调 训练自己的数据集 相信之前大家很多都是套用别人的模
  • 选择正确的DDoS解决方案:按需云服务

    迁移到云端的优势 与部署独立硬件设备相比 迁移到云端有许多优势 保护基于云的应用程序 托管在云中的应用程序无法通过本地设备保护 因此需要基于云的保护 更大容量 随着容量 DDoS 攻击变得越来越大 许多攻击很容易超过典型企业级 DDoS 缓
  • java HashSet 如何判断元素是否存在

    HashSet不能添加重复的元素 当调用add Object 方法时候 首先会调用Object的hashCode方法判hashCode是否已经存在 如不存在则直接插入元素 如果已存在则调用Object对象的equals方法判断是否返回tru
  • Spring 中的Advice类型介绍

    Spring 中的 Advice 类型介绍 翻译原文链接 Introduction to Advice Types in Spring 1 概述 在本文中 我们将讨论可以在 Spring 中创建的不同类型的 AOP 通知 In this a
  • javaweb:监听域对象创建和销毁的Listener

    1 什么是Servlet监听器 先来看看什么是监听器 监听器是专门用于对其它对象身上发生的事件或状态改变进行监听和相应处理的对象 当被监视的对象发生情况时立即采取相应的行动 Servlet监听器是Servlet规范中定义的一种特殊类 它用于
  • ubuntu安装code

    进入链接 http code visualstudio com下载 deb 在下载好的文件处终端输入sudo dpkg i code xxx
  • sklearn 数据处理与特征工程

    1 数据处理的流程 2 数据预处理 Preprocessing Impute 2 1 数据无量纲化 在机器学习算法实践中 我们往往有着将不同规格的数据转换到同一规格 或不同分布的数据转换到某个特定分布的需求 这种需求统称为将数据 无量纲化
  • java对list分组_Java List排序,分组等操作

    假定有一列实体类对像 List list UserServer getList 去重 去除重复对象 每个属性的值都一样的 需要注意的是要先重写对象User的equals和hashCode方法 List distinctList list s
  • 冒泡排序,快速排序,选择排序详细过程

    一 冒泡排序 1基本思想 相邻的两个数之间进行比较 按照规则进行交换 2 实现思路 以升序排列为例 第一趟比较 先用第一个和第二个元素进行比较 将较大的交换到第二个位置上 然后第二个和第三个进行比较 将较大的放在第三个位置上 依次类推 第一