冒泡排序与快速排序【C语言】

2023-11-12

冒泡排序

基本思想

对有n个记录的序列进行冒泡排序,首先将第一个数字与第二个数字进行比较,若为逆序,则将两个数字的顺序交换。然后比较第二个数字与第三个数字,若为逆序,则将两个数字的顺序交换…依此类推,经过第一轮排序后,最大的数字将“下沉”到最后,每趟的比较次数依次减少。经过n-1轮排序,将得到一个递增的序列。

在这里插入图片描述

空间复杂度:O(1)

时间复杂度:O(n^2)

稳定性:稳定

代码实现

n个记录总共要进行n-1趟排序,第i趟的比较次数为n-i次。可以使用双层循环,外层循环控制第几轮排序,内层控制每一轮比较的次数。

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
void Input(); //输入数组
void Output(); //输出数组
void BubbleSort(); //冒泡排序

int arr[MAXSIZE];
int count = 0;

//冒泡排序
void BubbleSort(){
    int i ,j ,temp;
    for ( i = 0; i < count-1; i++)
    {
        for ( j = 0; j < count-i-1; j++)
        {
            if (arr[j] > arr[j+1])
            {
               temp = arr[j];
               arr[j] = arr[j+1];
               arr[j+1] = temp;
            }
        }
    }
}
//输入函数
void Input(){
    int x,i;
    char s;
    printf("please input less than 100 numbers, end with enter:\n");
    for (i = 0; s != '\n'; i++)
    {
        scanf("%d",&arr[i]);
        s = getchar();
        count++;
    }
}

//输出函数
void Output(){
    printf("sorted numbers:\n");
    for (int i = 0; i < count; i++){
        printf("%d\t",arr[i]);
    }
    printf("\n");
}

int main(){
    Input();
    BubbleSort();
    Output();
    system("pause");
    return 0;
}

运行结果:
在这里插入图片描述

快速排序

基本思想

快速排序是从冒泡排序改进而得的一种“交换”排序方法。采用的是一种分治的策略。

  1. 先从数列中取出一个数作为基准数(称为枢轴)。

  2. 将比基准数大的数全放到它的右边,小于或等于基准数的全放到它的左边。

  3. 再对左右两部分重复第(2)步,直到各区间只有一个数,达到整个序列有序。

在这里插入图片描述

空间复杂度:最好:O(n lb n),最坏:O(n)

时间复杂度:平均:O(n lb n),最坏:O(n^2)

稳定性:不稳定

代码实现

#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
void Input(); //输入数组
void Output(); //输出数组
int Partition(int low ,int high);//一趟快速排序排
void QuikSort(int s, int e); //快速排序

int arr[MAXSIZE];
int count = 0;
//一趟快排
//定义一个high,low,key(记录枢轴的值)
//最后将枢轴移到正确位置,返回枢轴的位置
int Partition(int low ,int high){
    arr[0] = arr[low]; //arr[0]记录枢轴,待排序列从arr[1]开始
    while (low < high)
    {
       while(low < high&&arr[high] >= arr[0])
            --high;
        arr[low] = arr[high];
       while (low < high&&arr[low] <= arr[0])
            ++low;
        arr[high] = arr[low];
    }
    arr[low] = arr[0];
    return low;  //返回枢轴的位置
}
//快排(递归调用)
void QuikSort(int s,int e){
    if (s < e) //s与e是待排序区域的上下界
    {
        int keyPosition = Partition(s,e); //对待排序列进行一次划分,并返回枢轴位置
        QuikSort(s,keyPosition-1);        //对左侧子序列递归排序
        QuikSort(keyPosition+1,e);        //对右侧子序列递归排序
    }
    
}
//输入函数
void Input(){
    int x,i;
    char s;
    printf("please input less than 100 numbers, end with enter:\n");
    for (i = 1; s != '\n'; i++)
    {
        scanf("%d",&arr[i]);
        s = getchar();
        count++;
    }
}

//输出函数
void Output(){
    printf("sorted numbers:\n");
    for (int i = 1; i <= count; i++){
        printf("%d\t",arr[i]);
    }
    printf("\n");
}

int main(){
    Input();
    QuikSort(1,count);
    Output();
    system("pause");
    return 0;
}

运行结果:

在这里插入图片描述

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

冒泡排序与快速排序【C语言】 的相关文章

随机推荐

  • 开发人员的绝佳生产力工具

    介绍 从长远来看 每天工作 8 小时对您没有帮助 但利用这些来最大化产出肯定会让您受益 这就是为什么生产力是最重要的事情之一 今天 我们将学习一些很棒的工具 它们可以提高您的工作效率 除非并且直到您将这些工具集成到您的工作流程中 否则了解这
  • 宋浩线性代数笔记(七)线性空间

    完结撒花 致此该系列数一的内容也全部更完 本帖为宋浩老师基础课笔记的最后一期 后期会出一些课本经典例题 知识串联 抑或宋浩老师考研强化的重点 敬请期待下一些列
  • Java21天打卡Day6-switch

    import java util Scanner public class Day6 switch case语句 题目 输入一个号码 判断该号码 是1就是一等奖 2是二等奖 3是三等奖 其他的阳光普照奖 public static void
  • vue中使用swiper-slide时,循环轮播失效?

    前言 vue 项目中使用时 组件swiper slide 如果用v for循环的话 loop true 就不能无缝轮播 每次轮播到最后一张就停止了 正文 代码如下
  • java 判断用户是否关注了公众号

    1 获取token public String getToken try HttpClient client HttpClients createDefault String tokenUrl MessageFormat format ht
  • 有关NodeBB从低版本1.7.x升级到最新的1.16.x版本

    有关NodeBB升级历险记 公司线上的论坛网站一直都是1 7 4版本 而且有不少地方感觉用起来不是很顺手 就想着应该给它升升级了 从1 7 4升级到最新的1 16 x版本 注 不要直接跨版本升级到最高版本 会有数据错乱的问题 升级实操 备份
  • js中对象数组根据对象id分组并转map

    js中对象数组根据对象id分组并转map 如果要将具有相同 id 属性的对象元素 分成不同的数组 可以先从对象数组中提取相同的 id 属性 再使用 Array reduce 和 Map 来进行对象数组的分类 具体实现 对象数组根据id分组并
  • 计算机停电自行启动,电脑自动断电,详细教您电脑开机自动断电怎么解决

    有时候电脑玩着玩着 突然断电关机了 正玩的很激情 突然电脑断电关机了 都恨不得把电脑砸了 一旦出现电脑开机后断电的情况 让我们习惯从软件下手的同学们来说 有点无从下手 下面 小编跟大伙一同探讨一下电脑开机自动断电的解决方法 说到电脑启动过程
  • 请用C语言写一个15*15的扫雷小游戏

    扫雷是一个非常有趣的游戏 可以使用 C 语言编写 下面是一个简单的扫雷代码示例 include
  • C++ 排序函数 sort(),qsort()的用法

    C库函数qsort C 库函数sort 其中qsort相对较慢 sort实现非常高效 qsort 功 能 使用 快速排序例程进行排序 头文件 include
  • 锐浪报表-实现导入导出

    锐浪报表 实现导入导出 实现思路 代码实现 实现思路 导入导出实现思路 我们使用锐浪报表自带的导出功能导出 XX grf 后 鼠标右键是可以像编辑文本一样编辑内容的 由此联想到 用记事本手写一个模板改一下后缀名是不是也可以当作报表模板 答案
  • 好消息:vue3.3发布了,来看看更新那些功能

    前言 vue3 3发布了 来看看更新那些功能 原英文地址 Announcing Vue 3 3 The Vue PointThe offical blog for the Vue js projecthttps blog vuejs org
  • 2023年完整版Java学习路线图

    目录 第一阶段 Java核心基础 第二阶段 数据库核心技术 第三阶段 Java Web内容 第四阶段 企业级框架讲解 第五阶段 分布式微服务架构 第六阶段 技能深入提升 第七阶段 企业级项目实战 Java学习路线图 以下是我为您提供的原创J
  • NOIP学习之顺序查找:145.找最大数序列

    测试链接 总时间限制 1000ms 内存限制 65536kB 描述 输入n行 每行不超过100个无符号整数 无符号数不超过4位 请输出最大整数以及最大整数所在的行号 行号从1开始 如果该数据在多个行中出现 则按从小到大输出相应行号 行号之间
  • 【计算机视觉

    文章目录 一 MnasNet 二 GhostNet 三 Compact Convolutional Transformers CCT 四 NesT 五 Res2Net 六 EfficientNetV2 七 Capsule Network 八
  • JQuery安装与下载教程

    jQuery安装与下载 JQuery 是一个javaScript库 是一个轻量级的 写的少 做的多 的JavaScript库 jQuery 极大地简化javaScript编程 juery相比js优点 jquery的onload加载事件速度更
  • 方波转为正弦波的简单方案简介

    将方波信号转化为正弦波信号 主要是需要抑制方波信号的谐波信号 主要是抑制三次谐波 经过仿真测试 能够将方波转化为正弦波的滤波器 其衰减必须足够陡峭 将谐波频率尽可能压掉 在实际的滤波器中 经过测试 采用椭圆低通滤波器是能够实现所需要的滤波功
  • 【C++】STL常用容器总结之四:链表list

    5 链表list List是每个节点包含前驱指针 后继指针和数据域三个部分的双向链表 List不提供随机存取 访问元素需要按顺序走到需存取的元素 时间复杂度为O n 在list的任何位置上执行插入或删除操作都非常迅速 只需在list内部调整
  • 单目标优化:飞狐优化算法(Flying Foxes Optimization,FFO)求解cec2017(提供Matlab代码)

    一 飞狐优化算法简介 飞狐优化算法 Flying Foxes Optimization FFO 由Konstantinos Zervoudakis与Stelios Tsafarakis于2022年提出 参考文献 Zervoudakis K
  • 冒泡排序与快速排序【C语言】

    冒泡排序 基本思想 对有n个记录的序列进行冒泡排序 首先将第一个数字与第二个数字进行比较 若为逆序 则将两个数字的顺序交换 然后比较第二个数字与第三个数字 若为逆序 则将两个数字的顺序交换 依此类推 经过第一轮排序后 最大的数字将 下沉 到