C语言排序算法实现

2023-11-20

冒泡排序

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

//数组的首地址传进去
void bubbleSorting(int *arr,int arrLength){

    for (int i = 0; i < arrLength; ++i) {
        for (int j = 0; j < arrLength-i-1; ++j) {
            if(arr[j]>arr[j+1]){
                int temp = arr[j+1];
                arr[j+1]=arr[j];
                arr[j]=temp;
            }
        }
    }
}

int main(){
    int arr[]={3,9,-1,10,20};
    int length = sizeof(arr)/sizeof(int);
    printf("%d\n",length);
    bubbleSorting(arr,length);
    for (int i = 0; i < length; ++i) {
        printf("%d ",arr[i]);
    }
    return 0;
}

选择排序

#include <stdio.h>
#include  <stdlib.h>
#include <string.h>
void selectedSorting(int* arr,int length){
    //int minNum = INT_MAX;  //整数中的最小值,由于是局部变量,必须赋初值
    for (int i = 0; i < length; ++i) {
        int minNum = INT_MAX;  //整数中的最小值,由于是局部变量,必须赋初值
        int index = 0;
        for (int j = i; j < length; ++j) {
            if(arr[j]<minNum){
                minNum=arr[j];
                index = j;
            }
        }
        //交换位置
        arr[index]=arr[i];
        arr[i]=minNum;
    }
}
int main() {
    int arr[]={8,3,2,1,7,4,6,5};
    selectedSorting(arr, sizeof(arr)/ sizeof(int));
    for (int i = 0; i < sizeof(arr)/ sizeof(int); ++i) {
        printf("%d ",arr[i]);
    }
    return 0;
}

插入排序

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

void insertionSorting(int* arr,int length){
    for (int i = 1; i < length; ++i) {
        //首先获取当前元素和索引
        int currentNum = arr[i];
        int currentIndex = i;
        while (currentNum<arr[currentIndex-1] && currentIndex>=0){
            arr[currentIndex]=arr[currentIndex-1];
            currentIndex--;
        }
        arr[currentIndex]=currentNum;
    }
}

int main() {
    int arr[]={8,3,2,1,7,4,6,5};
    insertionSorting(arr, sizeof(arr)/ sizeof(int));
    for (int i = 0; i < sizeof(arr)/ sizeof(int); ++i) {
        printf("%d ",arr[i]);
    }
    printf("hello,world!");
    return 0;
}

希尔排序(插入方式)(非交换方式)

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


void shellSorting(int* arr,int length){
    for (int gap = length/2; gap >=1 ; gap=gap/2) {
        for (int i = 0; i < length; i=i+gap) {
            int currentNum = arr[i];
            int currentIndex = i;
            while (currentNum<arr[currentIndex-gap] && currentIndex>=0){
                arr[currentIndex]=arr[currentIndex-gap];
                currentIndex=currentIndex-gap;
            }
            arr[currentIndex]=currentNum;
        }
    }
}
int main() {

    int arr[]={8,3,2,1,7,4,6,5};
    shellSorting(arr, sizeof(arr)/ sizeof(int));
    for (int i = 0; i < sizeof(arr)/ sizeof(int); ++i) {
        printf("%d ",arr[i]);
    }
    printf("hello,world!");
    return 0;
}

快速排序

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

//递归形式进行排序,分程左右两个部分,需要找到一个基准数
void quickSorting(int *arr,int left,int right){
     int l  = left;
     int r  = right;
     //pivot 中轴值
     int pivot = arr[(right+left)/2];
     int temp = 0;

     // while循环的目的是比中轴值小放到左边, 比中轴值大放到右边
     while (l<r){
         //左边先找,找到一个元素
         while (arr[l]<pivot){
             l+=1;
         }

         //右边先找,找到一个元素
         while (arr[r]>pivot){
             r-=1;
         }

         //如果l>=r说明pivot的左右两的值,已经交完完成
         if(l>=r){
             break;
         }

         //交换
         temp=arr[l];
         arr[l]=arr[r];
         arr[r]=temp;

         //如果交换完后,发现这个arr[l]==pivot值 相等r--,前移
         if(arr[l]==pivot){
             r-=1;
         }

         //如果交换完后,发现这个arr[r]==pivot值 相等l++,前移
         if(arr[r]==pivot){
             l+=1;
         }

     }

     //如果l==r,必须l++ ,r-- ,否则为出现栈溢出
     //如果是奇数个数字,如果不再走一步,就会在中间相遇,必须错开中轴值
     if(l==r){
        l+=1;
        r-=1;
     }

     //向左递归
     if(left<r){
         quickSorting(arr,left,r);
     }

     //向右递归
     if(right>l){
        quickSorting(arr,l,right);
     }

}

int main() {
    int arr[]={8,3,2,1,7,4,6,5};
    quickSorting(arr, 0,(sizeof(arr)/ sizeof(int))-1);
    for (int i = 0; i < sizeof(arr)/ sizeof(int); ++i) {
        printf("%d ",arr[i]);
    }
    printf("hello,world!");
    return 0;
}

归并排序(分治思想)

在这里插入图片描述
在这里插入图片描述

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

//合并数组
void merge(int* arr,int left,int mid,int right,int *temp){
     int i = left; //初始化i,左边有序序列的初始索引
     int j = mid+1; //初始化j,右边有序序列的初始索引
     int t = 0; //指向temp数组的当前索引

     //第一步
     //先把左右两边(有序)的数据按照规则填充到temp数组
     //直到左右两边的有序序列,有一边处理完毕
     while (i<=mid && j<=right){
        if(arr[i]<=arr[j]){
            temp[t]=arr[i];
            t+=1;
            i+=1;
        }else{
            temp[t]=arr[j];
            t+=1;
            j+=1;
        }
     }

     //第二步
     //把剩余数据的一边的数据依次全部填充到temp中
    while (i<=mid){
        temp[t]=arr[i];
        t+=1;
        i+=1;
    }

    while (j<=right){
        temp[t]=arr[j];
        t+=1;
        j+=1;
    }

    //第三步
    //将temp数据拷贝到arr
    //注意,并不是每次都拷贝所有
    t=0;
    int tempLeft =left;
    while (tempLeft<=right){
       arr[tempLeft]=temp[t];
       t+=1;
       tempLeft+=1;
    }
}


/**
 * @param arr 待排序的数组
 * @param left 左索引
 * @param right 右索引
 * @param temp  临时开辟的数组,用于局部排序和存储
 */
void mergeSorting(int* arr,int left,int right,int *temp){

    if(left<right){
        int mid = (left+right)/2; //中间索引

        //向左递归拆解
        mergeSorting(arr,left,mid,temp);

        //向右递归拆解
        mergeSorting(arr,mid+1,right,temp);

        //聚合
        merge(arr,left,mid,right,temp);
    }
}



int main() {
    int arr[]={8,3,2,1,7,4,6,5};
    int temp[sizeof(arr)/ sizeof(int)]={};
    mergeSorting(arr, 0,sizeof(arr)/ sizeof(int),temp);
    for (int i = 0; i < sizeof(arr)/ sizeof(int); ++i) {
        printf("%d ",arr[i]);
    }
    printf("hello,world!");
    return 0;
}

基数排序(桶排序)

在这里插入图片描述

基数排序的基本思想(典型的空间换时间方式):

将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成后,数列就变成了一个有序序列。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include  <stdlib.h>
#include <string.h>
//#define NUMBER 10

void radixSorting(int *arr, int length) {
    char strTemp[] = " ";
    int max = arr[0];
    for (int i = 0; i < length; ++i) {
        if (arr[i] >= max) {
            max = arr[i];
        }
    }
    //得到最大数的是几位数
    sprintf(strTemp,"%d",max);
    int maxLength = strlen(strTemp);
    //定义一个二维数组,表示10个桶,每个桶就是一个一维数组
    //二维数组包括10个一维数组
    int bucket[10][length];

    //为了记录每个桶中实际存放了多少个数据,我们定义一个一维数组来记录每个桶每次放入的数据的个数
    //即bucketElementCounts[0] 代表bucket[0]中存放的个数
    int bucketElementCounts[10]={};

    for (int i = 0,n=1; i < maxLength; ++i,n*=10) {
         //针对每个元素的对应位进行排序处理,第一次是各位,第二次是十位,第三次是百位
        for (int j = 0; j < length; ++j) {
            //取出每个元素对应位的值
            int digitOfElement = arr[j]/n%10;
            //放入到对应的桶中
            bucket[digitOfElement][bucketElementCounts[digitOfElement]]=arr[j];
            bucketElementCounts[digitOfElement]++;
        }

        //按照这个桶的顺序(一维数组的下标依次取出数据,放入原来的数组)
        int index =0;
        //遍历每一桶,并将桶中得数据,放回到原数组
        for (int k = 0; k < sizeof(bucketElementCounts)/ sizeof(int); ++k) {
            //如果桶中有数据,我们才放回到原数组中
            if(bucketElementCounts[k]!=0){
                //循环该桶,即第k个桶(即第k个一维数组),放入
                for (int l = 0; l < bucketElementCounts[k]; ++l) {
                    //取出元素放回到arr
                    arr[index++]=bucket[k][l];
                }
            }

            //取出数据放回后,需要将记录每个桶的中元素个数的数据清零
            bucketElementCounts[k]=0;
        }
    }
}
int main() {

    int arr[] = {53, 3, 542, 748, 14, 214};
    radixSorting(arr, sizeof(arr)/ sizeof(int));

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

在这里插入图片描述
速度较快,但是遇到超大数量级的就不行了。空间不足,容易造成内存溢出。

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

C语言排序算法实现 的相关文章

  • 基于java的物资管理系统设计与实现

    基于java的物资管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的物资管理系统设计与实现的研究背景和动机在于提高物资管理系统的效率和质量 使得物资管理系统更加便捷 快速 准确 从而提高物资管理的水平 该系统的设计和实现主要围
  • 软件测试|sqlalchemy relationship

    简介 SQLAlchemy是一个流行的Python ORM 对象关系映射 库 它允许我们以面向对象的方式管理数据库 在SQLAlchemy中 relationship 是一个重要的功能 用于建立表之间的关系 在本文中 我们将详细探讨 rel
  • 基于java的学生成绩管理系统设计与实现

    基于java的学生成绩管理系统设计与实现 I 引言 A 研究背景和动机 学生成绩管理系统是一个重要的教育工具 能够帮助学校管理学生的成绩和考试结果 以便更好地评估学生的教育水平和发展潜力 Java是一种广泛应用的编程语言 具有跨平台 高效
  • 软件测试|Python数据可视化神器——pyecharts教程(九)

    使用pyecharts绘制K线图进阶版 简介 K线图 Kandlestick Chart 又称蜡烛图 是一种用于可视化金融市场价格走势和交易数据的图表类型 它是股票 外汇 期货等金融市场中最常用的技术分析工具之一 可以提供关于价格变动 趋势
  • 软件测试|教你使用Python下载图片

    前言 我一直觉得Windows系统默认的桌面背景不好看 但是自己又没有好的资源可以进行替换 突然我一个朋友提醒了我 网络上的图片这么多 你甚至可以每天换很多个好看的背景 但是如果让我手动去设置的话 我觉得太麻烦了 我不如使用技术手段将图片下
  • 基于java的物流信息网系统设计与实现

    基于java的物流信息网系统设计与实现 I 引言 A 研究背景和动机 基于Java的物流信息网系统设计与实现的研究背景和动机 随着互联网的普及和电子商务的快速发展 物流信息网系统已成为现代物流管理的重要组成部分 物流信息网系统能够实现物流信
  • 【计算机毕业设计】电影播放平台

    电影播放平台采用B S架构 数据库是MySQL 网站的搭建与开发采用了先进的java进行编写 使用了springboot框架 该系统从两个对象 由管理员和用户来对系统进行设计构建 主要功能包括 个人信息修改 对用户 电影分类 电影信息等功能
  • 【计算机毕业设计】二手图书交易系统

    随着世界经济信息化 全球化的到来和互联网的飞速发展 推动了各行业的改革 若想达到安全 快捷的目的 就需要拥有信息化的组织和管理模式 建立一套合理 动态的 交互友好的 高效的二手图书交易系统 当前的信息管理存在工作效率低 工作繁杂等问题 基于
  • 【计算机毕业设计】白优校园社团网站的设计与实现

    近些年 随着中国经济发展 人民的生活质量逐渐提高 对网络的依赖性越来越高 通过网络处理的事务越来越多 随着白优校园社团网站的常态化 如果依然采用传统的管理方式 将会为工作人员带来庞大的工作量 这将是一个巨大考验 需要投入大量人力开展对社团
  • 【计算机毕业设计】宝鸡文理学院学生成绩动态追踪系统

    研究开发宝鸡文理学院学生成绩动态追踪系统的目的是让使用者可以更方便的将人 设备和场景更立体的连接在一起 能让用户以更科幻的方式使用产品 体验高科技时代带给人们的方便 同时也能让用户体会到与以往常规产品不同的体验风格 与安卓 iOS相比较起来
  • 【无迹卡尔曼滤波】不确定和间接测量的非线性动力系统识别研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 最新整理Java面试八股文,大厂必备神器

    在看这篇文章之前 我想我们需要先搞明白八股文是什么 明清科举考试的一种文体 也称制义 制艺 时文 八比文 八股文章就四书五经取题 内容必须用古人的语气 绝对不允许自由发挥 而句子的长短 字的繁简 声调高低等也都要相对成文 字数也有限制 八股
  • 计算机Java项目|springboot校园台球厅人员与设备管理系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 【go语言】结构体数据填充生成md错误码文件

    这里使用pongo2这个模版引擎库进行md文件渲染 GitHub flosch pongo2 Django syntax like template engine for Go package main import fmt github
  • 【路径规划】基于改进遗传算法求解机器人栅格地图路径规划(Matlab实现实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 2024最强Java面试八股文合集(持续更新)

    今天要谈的主题是关于求职 求职是在每个技术人员的生涯中都要经历多次 对于我们大部分人而言 在进入自己心仪的公司之前少不了准备工作 有一份全面细致 面试题 将帮助我们减少许多麻烦 在跳槽季来临之前 特地做这个系列的文章 一方面帮助自己巩固下基
  • 在 Python 中实现 List 抽象

    在 Python 中 创建一个包含多个对象的 list 很常见 例如 对于一组具有相同功能的对象 比如播放声音 希望能够使用类似 my list play 的语法来触发 list 中所有对象的 play 方法 另一个例子是 当希望关闭 li
  • 【安全】Java幂等性校验解决重复点击(6种实现方式)

    目录 一 简介 1 1 什么是幂等 1 2 为什么需要幂等性 1 3 接口超时 应该如何处理 1 4 幂等性对系统的影响 二 Restful API 接口的幂等性 三 实现方式 3 1 数据库层面 主键 唯一索引冲突 3 2 数据库层面 乐
  • 计算机Java项目|人体健康信息管理系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • Java进阶之旅第七天

    Java进阶之旅第七天 文章目录 Java进阶之旅第七天 方法引用 介绍 代码展示 结果 方法引用的分类

随机推荐

  • 【C语言】合并两个数组,降序排列并删除重复元素(通俗易懂)

    问题描述 试着写一个程序 具体内容如下 建立两个整型数组 int n scanf d n int a n 将其合并 对他们进行降序排序 去掉相同项 输出处理过后的数组 输入形式 首先第一行输入第一个数组中的长度n 然后输入n个整型数 然后在
  • MYSQL进阶-msql日志-慢查询日志

    2 慢查询日志 慢查询日志主要用来记录执行时间超过设置的某个时长的SQL语句 能够帮助数据库维护人员找出执行时间比较长 执行效率比较低的SQL语句 并对这些SQL语句进行针对性优化 2 1 开启慢查询日志 可以在my cnf文件或者my i
  • ant design pro 代码学习(七) ----- 组件封装(登录模块)

    以登录模块为例 对ant design pro的组件封装进行相关分析 登录模块包含基础组件的封装 组件按模块划分 同类组件通过配置文件生成 跨层级组件直接数据通信等 相对来说还是具有一定的代表性 1 登录模块流程图 首先 全局了解一下登录模
  • 在idea中安装并且使用easy code插件 ,以及在idea中配置mysql数据库

    在idea中安装并且使用easy code插件 以及在idea中配置mysql数据库 1 从导航栏进入设置页面 2 点击plugins选项 在输入框中输入easy code查找 并点击installed安装 下载安装好了以后需要重启软件 点
  • GNURadio报错Unable to create context(windows10环境)

    GNURadio报错Unable to create context windows10环境 这里本人使用的是GNU Radio3 7 11 iiosupport win64 版本 外设是ADI的ADALM PLUTO 这里本人使用的是GN
  • 多维时序

    多维时序 MATLAB实现ELM极限学习机多维时序预测 股票价格预测 目录 多维时序 MATLAB实现ELM极限学习机多维时序预测 股票价格预测 效果一览 基本介绍 程序设计 结果输出 参考资料 效果一览 基本介绍
  • 2018-12-13 LeetCode Q5 最长回文子串

    5 最长回文子串 给定一个字符串 s 找到 s 中最长的回文子串 你可以假设 s 的最大长度为 1000 示例 1 输入 babad 输出 bab 注意 aba 也是一个有效答案 示例 2 输入 cbbd 输出 bb 暴力解法 6004ms
  • 关于linux进程间的close-on-exec机制

    转载请注明出处 帘卷西风的专栏 http blog csdn net ljxfblog 前几天写了一篇博客 讲述了端口占用情况的查看和解决 关于linux系统端口查看和占用的解决方案 大部分这种问题都能够解决 在文章的最后 提到了一种特殊情
  • 判断字符串的两半是否相似(1704.leetcode)-------------------c++实现

    判断字符串的两半是否相似 1704 leetcode unordered map c 实现 题目表述 给你一个偶数长度的字符串 s 将其拆分成长度相同的两半 前一半为 a 后一半为 b 两个字符串 相似 的前提是它们都含有相同数目的元音 a
  • Tensorflow学习(五)——多任务学习验证码识别实战

    一 验证码生成 验证码生成脚本 使用captcha包提供的ImageCaptcha方法 from captcha image import ImageCaptcha import sys import random import numpy
  • 成功解决笔记本重装系统后没有无线网

    笔记本重装系统后没有无线网 一般的解决思路就是下载笔记本厂家官方提供的各类驱动程序 重新安装驱动 驱动下载的地址 建议到各个厂家的官网上去寻找驱动资源 以本人的笔记本型号为例 点击window R 然后输入dxdiag运行 然后找到该官方开
  • 用js/react写一个计算器

    效果图如下 直接上代码 目录如下 Button和Text是自己封装的Button组件和Input组件 Button index js import react Component from react import index css cl
  • 图像风格迁移cvpr2020_今日 Paper

    目录 CurricularFace 深度人脸识别的适应性课程学习损失 MaskGAN 多样和交互的面部图像操作 结合检测和跟踪的视频人体姿态估计 通过解纠缠表示的局部面部妆容迁移 基于自动生成的训练数据进行大规模事件抽取学习 Curricu
  • 【UiBot】RPA定时触发:机器人如何在指定时间执行任务?

    Q RPA机器人如何在指定时间点执行任务 A 用流程机器人 UiBot Worker 设置定时触发 人机交互的流程机器人 UiBot Worker 除了手动运行流程之外 还提供了 触发器 的功能 可以在满足一定条件时 有计划 有选择性地执行
  • C++定义二维数组并赋值,亲测可用

    代码在这里 拿走不谢 include
  • IDEA springboot项目导出jar包及运行jar包

    首先点击Terminal 在Terminal下输入 mvn clean package 看到以下这个提示则是打包成功 接着咱们可以在自己的项目下看到打包成功的jar包 如图 运行jar包 我的jar包位置如下 写一个bat文件 里面的内容为
  • 实时监控Cat之旅~配置Cat集群需要注意的问题

    在配置cat集群时 有一些设置是我们应该注意的 从它的部署文档中我们可以看到相关信息 但说的还不够明确和重要 大叔今天总结一下Cat集群配置的注意事项 服务端datasources xml用来设置连接的mysql 集群里的服务器对这项配置是
  • pyecharts运行后产生的html文件用浏览器打开空白

    引用 https github com pyecharts pyecharts issues 503 使用logging日志打印代码错误 coding utf 8 from future import unicode literals im
  • Mageia 9 发布:搭载 Linux 内核 6.4,支持 PulseAudio

    导读 Mageia 最初是 Mandriva Linux 的一个分支 但现在已经发展成全面的 独立 Linux 发行版 从 2010 年以来 Mageia 已经成为一个用于桌面或服务器的稳定且安全的操作系统 并且定期更新 它的近期的发布公告
  • C语言排序算法实现

    C语言实现各种排序算法 冒泡排序 选择排序 插入排序 希尔排序 插入方式 非交换方式 快速排序 归并排序 分治思想 基数排序 桶排序 基数排序的基本思想 典型的空间换时间方式 冒泡排序 include