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

news2024/11/25 13:07:56

文章目录

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

本文主要介绍用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语言实现插入排序、希尔排序、冒泡排序、选择排序和快速排序的所有内容了!

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

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

相关文章

[C]环境(0/0)→ 环境配置

这里写目录标题 0x00 额环境下载解压 0x00 额 写了那么多C的入门&#xff0c;就是没写C语言的环境配置&#xff0c;乘此机会写了吧。 环境下载 直接在我这下载就好了&#xff0c;毕竟用了挺久没啥问题的 C语言环境&#xff08;gcc version 8.1.0&#xff09; 解压 最后得到…

【JAVA学习笔记】66 - 本章作业(IO流)

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter19/src/com/yinhai/homework 1.使用File类和FileWriter类 (1)在判断e盘下是否有文件夹mytemp&#xff0c;如果没有就创建mytemp public class Homework01 {public static void main(String…

大数据技术从业者注意了!使用代理IP时避开这些误区

作为一名专业的大数据从业者&#xff0c;我经常需要使用HTTP代理IP进行数据爬取工作。在这个过程中&#xff0c;我积累了一些关于使用代理IP的经验&#xff0c;同时也发现了一些新手常见的误区&#xff0c;这些误区可能会影响你的工作的效率和数据准确性。我将分享一些关于使用…

使用超融合,网络交换机如何选型与配置?

很多用户在部署超融合集群时&#xff0c;都会关注网络交换机的选型与配置。我们在这篇文章中整理了一些关于网络交换机的常见提问&#xff0c;并邀请 SmartX 技术专家进行了详细解答。 Q1. 超融合架构下&#xff0c;网络交换机是如何部署的&#xff1f;需要多少台交换机&#x…

黑芝麻智能与香港科技园签订合作备忘录,迈向全球化发展新阶段

11月6日&#xff0c;黑芝麻智能与香港科技园公司举行合作签约仪式&#xff0c;双方将合力推动黑芝麻智能香港科技创新研发中心在科技园落地&#xff0c;并促进园区打造车规级高性能智能汽车计算芯片平台。黑芝麻智能首席市场营销官杨宇欣、香港科技园公司首席企业发展总监姚庆良…

学妹刚毕业那天,我连夜用Python采集了上万份岗位数据,只为给她找一份好工作

记得学妹刚毕业那天&#xff0c;为了不让学妹毕业就失业&#xff0c;连夜我就用Python采集了上万份岗位&#xff0c;分析出最合适她的工作。 为此&#xff0c;学妹连夜来我家表示感谢&#x1f60d; 我们开始今天的正题吧 首先要准备这些 软件 Python 3.8Pycharm 模块使用 …

棱镜七彩加入UOS主动安全防护计划(UAPP),共建信创生态

近日&#xff0c;在统信UOS主动安全防护计划&#xff08;UAPP&#xff09;技术沙龙上&#xff0c;2023年度第二期UAPP合作伙伴授牌发布仪式正式举行。棱镜七彩作为国内专注开源安全与软件供应链安全的创新型厂商&#xff0c;正式获得官方授牌&#xff0c;成为 UAPP 成员单位。 …

2021年09月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 对于数列3,8,11,15,17,19,25,30,44,采用“二分查找”法查找8,需要查找多少次? A:5 B:4 C:3 D:2 答案:D 按二分查找法的规律,每次先查找中间值,进行比较。 第2题…

在vue中如果头像为空时用姓名第一个字当头像

业务场景:当个人资料或者用户头像没有图片时&#xff0c;默认使用户名字中第一个汉字做头像。 效果图&#xff1a; 完整代码&#xff1a; <el-avatarsize"large" style"width: 45px; height: 45px; line-height: 45px; font-size: 24px"v-if"…

无需开发,精臣云可轻松连接用户运营、广告推广等行业应用

精臣智慧标识科技有限公司简介 武汉精臣智慧标识科技有限公司&#xff0c;是国内便携式标签打印机创新品牌和实物管理解决方案服务商。在物品标签还处在繁琐的PC打印时代&#xff0c;精臣公司便创造性地从智能便携角度出发&#xff0c;顺应移动互联时代趋势&#xff0c;推出了…

HarmonyOS开发:回调实现网络的拦截

前言 上一篇文章&#xff0c;分享了一个基于http封装的一个网络库&#xff0c;里面有一个知识点&#xff0c;在初始化的时候&#xff0c;可以设置请求头拦截和请求错误后的信息的拦截&#xff0c;具体案例如下&#xff1a; Net.getInstance().init({netErrorInterceptor: new M…

1995-2020年全国各省二氧化碳排放量面板数据

1995-2020年全国各省二氧化碳排放面板数据 1、时间&#xff1a;1995-2020 2、范围&#xff1a;全国、30省 3、来源&#xff1a;中国能源统计NJ 4、指标&#xff1a; 统计年度、地区代码、地区名称、煤炭二氧化碳排放量、焦炭二氧化碳排放量、原油二氧化碳排放量、汽油二氧…

苹果Apple ID忘了或者咨询其他问题如何让苹果客服打电话给你

环境&#xff1a; iPhone11 Apple ID 问题描述&#xff1a; 苹果Apple ID忘了或者咨询其他问题如何让苹果客服打电话给你 上次公司苹果设备&#xff0c;忘了激活锁的账户密码要向苹果申请解锁&#xff0c;打了很长电话&#xff0c;平时语音超套餐了&#xff0c;想着让他们…

python 删除特定字符所在行

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 查询文件中含有特殊字符串的行 #!/usr/bin/python # -*- coding:utf-8 -*- import re file1 open(test.txt,r) istxt re.compile(r.*if.*,re.I) for line in file1.readlines():line line.strip()ifstr re.findall(istxt…

【好书推荐】计算机考研精炼1000题——考研408不可或缺

《计算机考研精炼1000题》简介 本书根据最新《全国硕士研究生招生考试计算机学科专业基础考试大纲》编写。参考过去十多年的真题&#xff0c;本书精心编排了单项选择题和综合应用题&#xff0c;共约1000道&#xff08;分为上下两册&#xff0c;共24章。上册&#xff08;1&#…

安卓三防手持终端 二维码扫描识别器 pda条码手持机

PDA条码手持机是一种快速的数据采集设备&#xff0c;具备多种数据采集功能并且可以进行二次开发&#xff0c;可以针对性的进行定制服务&#xff0c;满足各种业务需求。因其体积小&#xff0c;易操作、功能全、效率高深受物联网行业的青睐。 条码扫描是PDA重要的功能之一&#…

Java Web 学习笔记(四) —— MyBatis

目录 1 MyBatis 概述2 MyBatis 快速入门3 Mapper 代理开发4 配置文件实现CRUD4.1 环境准备4.2 查询所有数据4.2.1 编写接口方法4.2.2 编写 SQL 语句4.2.3 编写测试方法4.2.4 结果映射问题 4.3 查询详情4.3.1 编写接口方法4.3.2 编写SQL语句4.3.3 编写测试方法 4.4 多条件查询4.…

11月11日|欢迎参加Sui Meetup泰国活动!

现在是Sui基金会与泰国Sui社区见面的时候啦&#xff0c;我们诚邀每个人参加今年最大的Sui Meetup泰国活动&#xff0c;主题是“Summer Paradise&#xff08;夏日天堂&#xff09;”。在活动中&#xff0c;您将会见到来自Sui基金会、ContributionDAO、KX、Inspex、Cryptomind、A…

解决问题:-1: error: LNK1104: 无法打开文件“D3dx9.lib”

解决问题:-1: error: LNK1104: 无法打开文件“D3dx9.lib” 先安装Microsoft DirectX SDK (June 2010)&#xff0c;安装包名字叫DXSDK_Jun10.exe&#xff0c; Microsoft DirectX SDK 2010 版本下载 http://www.microsoft.com/en-us/download/details.aspx?id6812 Version: Date…

Vue 循环el-select 并且不能重复选择相同数据

根据已选择的属性 , 禁用相同属性的选项 ,如果重复则不能再选择 <template><div class"container"><h3>需求&#xff1a;一共4台车 每人只能选择不一样的车 选过的不能再选</h3><divv-for"(item, index) in person.model.selectList…