C语言---插入排序、希尔排序、冒泡排序、选择排序、快速排序简单介绍

文章目录

  • 插入排序
  • 希尔排序
  • 冒泡排序
  • 选择排序
  • 快速排序

本文主要介绍用C语言实现的一些排序方法,有插入排序、希尔排序、冒泡排序、选择排序和快速排序,文章中给出的例子都是按照升序排列的。


插入排序

若数组只有一个元素,自然不用排序,插入排序从数组的第二个元素开始,先将当前的元素存起来,然后将它和前面的元素依次比较,大于它的元素依次向后移动,直到找到小于或等于它的元素,将存放的这个元素赋值给经过比较找到的数组位置中,就完成了一次插入排序,每完成一次插入排序,前面的(n+1)个数就已经是顺序的了,其中n为当前完成插入排序的次数。让一个有n个元素的数组顺序排列,需要n-1次插入排序。
插入排序的完整代码如下。

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

void print_array(int *a,int n)
{
    int i;
    for (i=0; i<n;i++)
        printf("%d ",a[i]);
    printf("\n");
}

void InsertSort(int *a,int n)
{
    int i,j,temp;
    if(n==1)
    {
        printf("After InsertSort array : \n");
        print_array(a,n);
    }
    for(i=1;i<n;i++)
    {
        temp = a[i];   //保存当前值
        for(j=i-1;j>=0;j--)
        {
            if(a[j] > temp)
                a[j+1] = a[j];   //前面的值比当前值大,向后移动
            else
                break;      //找到了当前值该插入的位置
        }
        a[j+1] = temp;   //将当前值插入在找到的位置
        printf("After %d InsertSort array : ",i);
        print_array(a,n);
        if(i==n-1)
        {
            printf("After InsertSort array : \n");
            print_array(a,n);
        }    
    }
}

void main()
{
    int n,i;
    int *a;
    printf("Please input the number of the integer : ");
    scanf("%d",&n);
    a = (int*)malloc(n*sizeof(int));
    printf("Please input %d integer numbers : \n",n);
    for(i=0; i<n; i++)
        scanf("%d",&a[i]);
    printf("Original array : \n");
    print_array(a,n);
    InsertSort(a,n);
}

运行结果如下图所示。
在这里插入图片描述


希尔排序

希尔排序是比较特殊的插入排序,上面提到的插入排序每次的步长为1,希尔排序是将待排序列分为若干个子序列,对这些子序列分别进行插入排序,初始的步长是要排列元素数量的一半(取整),之后每次折半,最后一次排序是步长为1的插入排序。
希尔排序的完整代码如下。

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

void print_array(int *a,int n)
{
    int i;
    for (i=0; i<n;i++)
        printf("%d ",a[i]);
    printf("\n");
}

void ShellSort(int *a,int n)
{
    int i,j,k,temp,gap;
    if(n==1)  //数组只有一个元素
    {
        printf("After ShellSort array : \n");
        print_array(a,n);
    }
    gap = n/2;   //初始值为数组长度的一半取整
    while(gap > 0)  //退出循环的条件是 gap = 0
    {
        for(i=0;i<gap;i++)    //i为每组第一个元素的下标
        {
            for(j=gap+i;j<n;j+=gap)  //j的初始值为每组第二个元素的下标
            {
                temp = a[j];   //保存需要插入的值
                for(k=j-gap;k>=0;k-=gap)   //从j的前一个元素j-gap开始比
                {
                    if(a[k]>temp)
                        a[k+gap] = a[k];  //注意gap的值
                    else
                        break;
                }
                a[k+gap] = temp;  //插入到指定位置
            }
        }
        printf("After gap=%d ShellSort array : ",gap);
        print_array(a,n);
        gap = gap/2;   //gap的值在每次过后减半
    }
    printf("After ShellSort array : \n");
    print_array(a,n);
}

void main()
{
    int n,i;
    int *a;
    printf("Please input the number of the integer : ");
    scanf("%d",&n);
    a = (int*)malloc(n*sizeof(int));
    printf("Please input %d integer numbers : \n",n);
    for(i=0; i<n; i++)
        scanf("%d",&a[i]);
    printf("Original array : \n");
    print_array(a,n);
    ShellSort(a,n);
}

运行结果如下图所示。
在这里插入图片描述


冒泡排序

冒泡排序相对比较简单,每趟冒泡排序从头开始,相邻两元素比大小,前面的元素比后面的元素大就交换,否则不交换继续往后比较,可以控制循环不用从头比较到尾,因为每经过一趟冒泡排序,所剩下元素中最大的数会被移动到数组末端,后面序列是有序的。
冒泡排序的完整代码如下。

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

void print_array(int *a,int n)
{
    int i;
    for (i=0; i<n;i++)
        printf("%d ",a[i]);
    printf("\n");
}

void BubbleSort(int *a,int n)
{
    int i,j,temp;
    if(n==1)  //数组只有一个元素
    {
        printf("After BubbleSort array : \n");
        print_array(a,n);
    }
    for(i=0;i<n-1;i++)  //外层循环执行次数比元素个数小1
    {
        for(j=0;j<n-i-1;j++)  //内层循环每次执行的次数跟i值有关
        {
            if(a[j]>a[j+1]) //相邻元素做比较,根据比较结果决定交换与否
            {
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }
        printf("After %d BubbleSort array : ",i+1);
        print_array(a,n);
    }
    printf("After BubbleSort array : \n");
    print_array(a,n);
}

void main()
{
    int n,i;
    int *a;
    printf("Please input the number of the integer : ");
    scanf("%d",&n);
    a = (int*)malloc(n*sizeof(int));
    printf("Please input %d integer numbers : \n",n);
    for(i=0; i<n; i++)
        scanf("%d",&a[i]);
    printf("Original array : \n");
    print_array(a,n);
    BubbleSort(a,n);
}

运行结果如下图所示。
在这里插入图片描述


选择排序

选择排序就是在每一趟排序中找到剩余元素中的最小值,然后将其与数组中第n个元素(第n趟排序就是第n个元素)进行交换(如果最小的是自己,不用交换),为了优化,可以在一次循环中同时找到最大值和最小值分别交换,这样只需执行元素数量的一半即可完成最终排序。
选择排序的完整代码如下。

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

void print_array(int *a,int n)
{
    int i;
    for (i=0; i<n;i++)
        printf("%d ",a[i]);
    printf("\n");
}

void SelectSort(int *a,int n)
{
    int i,j,k,min;
    if(n==1)  //数组只有一个元素
    {
        printf("After SelectSort array : \n");
        print_array(a,n);
    }
    for(i=0;i<n-1;i++)  //外层循环执行次数比元素个数小1
    {
		k = i;  
        min = a[i];  //选定当前值为最小值
        for(j=i+1;j<n;j++)  //内层循环每次执行的次数跟i值有关
        {
            if(a[j]<min)   //找出最小值的下标
            {
                min = a[j];  //更新当前最小值
                k = j;  //记录下标
            }  
        }
        if(k != i)   //当前元素不是最小值,交换
        {
            a[k] = a[i];
            a[i] = min;
        }
        printf("After %d SelectSort array : ",i+1);
        print_array(a,n);
    }
    printf("After SelectSort array : \n");
    print_array(a,n);
}

void main()
{
    int n,i;
    int *a;
    printf("Please input the number of the integer : ");
    scanf("%d",&n);
    a = (int*)malloc(n*sizeof(int));
    printf("Please input %d integer numbers : \n",n);
    for(i=0; i<n; i++)
        scanf("%d",&a[i]);
    printf("Original array : \n");
    print_array(a,n);
    SelectSort(a,n);
}

运行结果如下图所示。在这里插入图片描述
在一趟排序中同时找出最大值和最小值进行替换,这种情况下一定要注意,如果最大值出现在当前最小值将要存放的位置,如果你先交换了最小值,那么在交换最大值时就会出现问题,一定要在代码中进行判断,如果最大值出现在当前最小值将要存放的位置,那么在先交换了最小值后,在交换最大值时需要和交换最小值的那个位置进行交换。
同时找出最大值和最小值的选择排序的完整代码如下。

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

void print_array(int *a,int n)
{
    int i;
    for (i=0; i<n;i++)
        printf("%d ",a[i]);
    printf("\n");
}

void SelectSort(int *a,int n)
{
    int i,j,k,l,min,max;
    if(n==1)  //数组只有一个元素
    {
        printf("After SelectSort array : \n");
        print_array(a,n);
    }
    for(i=0;i<n/2;i++)  //外层循环执行次数是元素个数的一半
    {
		k = i;
        l = n-i-1;
        min = a[i];     //选定最小值
        max = a[n-i-1];  //选定最大值
        for(j=i;j<n-i;j++)  //内层循环每次执行的次数跟i值有关
        {
            if(a[j]<min)   //找出最小值的下标
            {
                min = a[j];  //更新当前最小值
                k = j;     //记录下标
            }
            else if(a[j]>max)
            {
                max = a[j];
                l = j; 
            }
        }
        if(k != i)
        {
            a[k] = a[i];
            a[i] = min;
        }
        if(l != n-i-1)    
        {
            if(l != i)
            {
                a[l] = a[n-i-1];
                a[n-i-1] = max;
            }
            else  //最大值位置已经被最小值填充,找到最大值被交换的位置再交换
            {
                a[k] = a[n-i-1];
                a[n-i-1] = max;
            }
        }
        printf("After %d SelectSort array : ",i+1);
        print_array(a,n);
    }
    printf("After SelectSort array : \n");
    print_array(a,n);
}

void main()
{
    int n,i;
    int *a;
    printf("Please input the number of the integer : ");
    scanf("%d",&n);
    a = (int*)malloc(n*sizeof(int));
    printf("Please input %d integer numbers : \n",n);
    for(i=0; i<n; i++)
        scanf("%d",&a[i]);
    printf("Original array : \n");
    print_array(a,n);
    SelectSort(a,n);
}

运行结果如下图所示。
在这里插入图片描述


快速排序

快速排序需要选择一个基准值key,一般选择最左边的,定义两个下标值,一个是最左边值的一个是最右边值的下标low和high,每次开始的时候,high先往左边移动,遇到比key值小的就停下,然后low开始往右边移动,遇到比key值大的就停下,此时,如果low<high,就交换low和high下标对应的值,然后依然是high先移动,low后移动,当low=high时,将这个位置的值和key值进行交换。交换完成后,key值左边的值都已经比它小,右边的值都比它大,然后在左右两边再选择基准值递归。注意,在移动时,先移动的是远离key值的那个下标值。
快速排序的完整代码如下。

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

int n,count = 1;
void print_array(int *a,int n)
{
    int i;
    for (i=0; i<n;i++)
        printf("%d ",a[i]);
    printf("\n");
}

void QuickSort(int *a,int low,int high)
{
    int key,temp;
    int start,end;
    if(low>=high)   //涉及递归,根据low和high的关系决定是否执行下面的代码
        return;
    start = low;  //记录起始位置
    end = high;
    key = a[low]; //基准值设定
    while(low < high)
    {
        while(low < high && a[high] >= key)   //一定是大于等于
            high--;
        while(low < high && a[low] <= key)    //一定是小于等于
            low++;
        //low<high时交换low和high对应的值
        temp = a[high];    
        a[high] = a[low];
        a[low] = temp;
    }
    //退出循环即low=high,交换其与key的值
    temp = a[high];
    a[high] = key;
    a[start] = temp;
    printf("After %d QuickSort array : ",count);
    print_array(a,n);
    count++;
    QuickSort(a,start,low-1);  //一分为二进行递归
    QuickSort(a,low+1,end);
}

void main()
{
    int i;
    int *a;
    printf("Please input the number of the integer : ");
    scanf("%d",&n);
    a = (int*)malloc(n*sizeof(int));
    printf("Please input %d integer numbers : \n",n);
    for(i=0; i<n; i++)
        scanf("%d",&a[i]);
    printf("Original array : \n");
    print_array(a,n);
    QuickSort(a,0,n-1);
    printf("After QuickSort array : \n");
    print_array(a,n);
}

运行结果如下图所示。
在这里插入图片描述
以上就是用C语言实现插入排序、希尔排序、冒泡排序、选择排序和快速排序的所有内容了!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

和数链“分布式存储”技术结合隐私计算让数据更安全

存储是IT业的核心技术&#xff0c;全球存储行业历经半个世纪的洗礼&#xff0c;在技术和需求相互促进的演变下沧桑变幻&#xff0c;经历桌面级存储、企业级存储、云存储多次迭代变迁。 目前的存储方式主要是“大数据中心”等集中式存储&#xff0c;随着数据规模和复杂度的迅速…

如何用Java实现一个基于机器学习的情感分析系统,用于分析文本中的情感倾向

背景&#xff1a;练习两年半&#xff08;其实是两周半&#xff09;&#xff0c;利用工作闲余时间入门一下机器学习&#xff0c;本文没有完整的可实施的案例&#xff0c;由于知识体系不全面&#xff0c;目前代码只能运行&#xff0c;不能准确的预测 卡点&#xff1a; 1 由于过…

Java自学第6课:电商项目(2)

1 创建工具类并连接数据库 在工程src右键单击new&#xff0c;新建util包 再创建DBUtil类 数据库交互需要有数据库支持的包&#xff0c;这是官方给出的类库。 先声明1个代码块 // 静态代码块 只加载1次static{try {Class.forName("com.mysql.jdbc.Driver");} catch (…

Kotlin文件和类为什么不是一对一关系

在Java中&#xff0c;一个类文件的public类名必须和文件名一致&#xff0c;如何不一致就会报异常&#xff0c;但是在kotlin的文件可以和类名一致&#xff0c;也可以不一致。这种特性&#xff0c;就跟c有点像&#xff0c;毕竟c的.h 和 .cpp文件是分开的。只要最终编译的时候对的…

无人机红外相机的畸变矫正

在项目开展过程中&#xff0c;发现大疆M30T的红外相机存在比较明显的畸变问题&#xff0c;因此需要对红外图像进行畸变矫正。在资料检索过程中&#xff0c;发现对红外无人机影像矫正的资料较少&#xff0c;对此&#xff0c;我从相机的成像原理角度出发&#xff0c;探索出一种效…

史上第一款AOSP开发的IDE (支持Java/Kotlin/C++/Jni/Native/Shell/Python)

ASFP Study 史上第一款AOSP开发的IDE &#xff08;支持Java/Kotlin/C/Jni/Native/Shell/Python&#xff09; 类似于Android Studio&#xff0c;可用于开发Android系统源码。 Android studio for platform&#xff0c;简称asfp(爱上富婆)。 背景&下载&使用 背景 由…

2022最新版-李宏毅机器学习深度学习课程-P34 自注意力机制类别总结

在课程的transformer视频中&#xff0c;李老师详细介绍了部分self-attention内容&#xff0c;但是self-attention其实还有各种各样的变化形式&#xff1a; 一、Self-attention运算存在的问题 在self-attention中&#xff0c;假设输入序列&#xff08;query&#xff09;长度是N…

leetcode:LCP 11. 期望个数统计(python3解法)

难度&#xff1a;简单 某互联网公司一年一度的春招开始了&#xff0c;一共有 n 名面试者入选。每名面试者都会提交一份简历&#xff0c;公司会根据提供的简历资料产生一个预估的能力值&#xff0c;数值越大代表越有可能通过面试。 小 A 和小 B 负责审核面试者&#xff0c;他们均…

Python克隆单个网页

网上所有代码都无法完全克隆单个网页&#xff0c;不是Css&#xff0c;Js下载不下来就是下载下来也不能正常显示&#xff0c;只能自己写了&#xff0c;记得点赞~ 效果如图&#xff1a; 源码与所需的依赖&#xff1a; pip install requests pip install requests beautifulsoup4…

Zigbee—网络层地址分配机制

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;孤雏 0:21━━━━━━️&#x1f49f;──────── 4:14 &#x1f504; ◀️ ⏸ ▶️ ☰ &#x1f497;关注…

CSS特效004:hover图片,显示文字或附加层

css实战中&#xff0c;时常会碰见鼠标放在某个区块上&#xff0c;显示出一段文字或者其他附加信息。思路是利用position的层叠关系&#xff0c;将文字层放在图片的上面&#xff0c;display:none; hover的时候层 display&#xff1a;block。 效果图 源代码 /* * Author: 大剑师…

windows系统自动更新中断电导致系统无法开启

windows系统自动更新中断电导致系统无法开启 现象原因解决进入bios拆机更新系统重新安装内存条 现象 前一天晚上电脑出现合上之后风扇继续转的现象&#xff0c;拔掉电源后&#xff0c;第二天开不了机。现象为按压电源键&#xff0c;电源键和充电指示灯亮一次后熄灭&#xff0c…

复盘一个诡异的Bug

该Bug的诡异之处在于这是一个由多种因素综合碰撞之后形成的综合体。纵观整个排查过程&#xff0c;一度被错误的目标误导&#xff0c;花费大量功夫后才找到问题点所在&#xff0c;成熟的组件在没有确凿证据之前不能随意怀疑其稳定性。 前言 此前在接入两台粒径谱仪&#xff08;…

SPASS-探索性分析

探索性分析的意义 探索性分析更加强大,它是一种在对资料的性质、分布特点等完全不清楚的情况下,对变量进行更深入研究的描述性统计方法。在进行统计分析前,通常需要寻求和确定适合所研究的问题的统计方法, SPSS提供的探索性分析是解决此类问题的有效办法 探索性分析提供了很…

消息中间件 - RocketMQ基础

一个进程内能够创建的线程数量是有限的。 所有中间件的目的&#xff1a; 性能效率上的一个提升代理&#xff1a;帮你去完成一些额外的事情 MQ介绍 MQ概述 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保存消息的容器&#xff0…

ArcGIS小技巧|四种计算图斑面积的方法

ArcGIS中有多种方法可计算出图斑面积&#xff0c;本文总结了四种方法&#xff0c;是否可堪称史上最全&#xff1f; 1、计算几何 这是最适合非专业人士的方法&#xff0c;直接利用ArcGIS中的计算几何功能进行计算。 a、首先添加一double类型字段&#xff0c;用来存储面积数值。…

论文阅读——Detection Hub(cvpr2023)

Detection Hub: Unifying Object Detection Datasets via Query Adaptation on Language Embedding 一、要解决的问题 大规模数据集可以提高模型性能&#xff0c;但是当训练多类别单一模型时&#xff0c;大规模数据集不能用在目标检测任务上&#xff0c;因为两个困难&#xff1…

【qemu逃逸】XCTF 华为高校挑战赛决赛-pipeline

前言 虚拟机用户名: root 无密码 设备逆向与漏洞分析 程序没有去符合, 还是比较简单. 实例结构体如下: 先总体说一下流程: encode 为 base64 编码函数, decode 为 base64 解码函数. 然后 encPipe 和 decPipe 分别存放编码数据和解码数据, 分别有四个: 其中 EncPipeLine 中…

简单选择排序(c语言代码实现)

选择排序&#xff1a;简单选择排序&#xff08;不稳定的排序&#xff09; 简单选择排序是一种基础的排序算法&#xff0c;它的基本思路是在未排序的序列中选择最小&#xff08;或最大&#xff09;的元素&#xff0c;将其与序列的第一个元素进行交换&#xff0c;然后在剩余的未…

解决idea启动tomcat控制台中文乱码

#1.tomcat日志中文乱码# 如图这种情况&#xff0c;一般在idea用tomcat跑一个web项目启动后tomcat日志在控制台打印出来会出现中文乱码的情况 解决方案1&#xff1a;tomcat的日志配置文件的编码修改&#xff0c;找到tomcat安装目录conf下的logging.properties&#xff0c;encod…