【C/C++】排序算法代码实现

这里,汇总了常见的排序算法具体代码实现。使用C语言编写。

排序算法实现

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

插入排序

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

void InsertSort(int arr[],int n){
    int i,j,temp;
    for(i = 1;i < n;i++){   //将各元素插入已排好的序列中
        if(arr[i] < arr[i-1]){  //若当前元素小于前驱
            temp = arr[i];    //暂存当前元素
            for(j = i-1;j >= 0 && arr[j] > temp;j--)  //检查前面所有排好的元素
                arr[j+1] = arr[j];  //所有大于temp的元素后移
            arr[j+1] = temp;  //复制到插入位置(j+1:j--多减了一个要加回来)
        }
    }
}

int main()
{
    int a[] = {12,32,61,5,9,63,89,2};
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    InsertSort(a,8);
    printf("\n");
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    return 0;
}


冒泡排序

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

void bubbleSort(int arr[],int n){
    for(int i=0;i<n-1;i++){//外层循环,n个元素需要循环n-1次
        for(int j=0;j<n-1-i;j++){  //内层循环,n个元素第i趟比较n-i次
            if(arr[j]>arr[j+1]){  //将较大的元素后移
                int temp = arr[j+1];
                arr[j+1] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

int main()
{
    int a[] = {12,32,61,5,9,63,89,2};
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    bubbleSort(a,8);
    printf("\n");
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    return 0;
}

选择排序

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

void selectSort(int a[],int n){
    int i,j,min = 0;
    for(i=0;i<n-1;i++){
        min = i;
        for(j=i+1;j<n;j++){
            if(a[j]<a[min]){  //寻找最小的数
                min = j;  //寻找最小的索引保存
            }
        }
        if(i!= min){
            int tmp = a[i];
            a[i] = a[min];
            a[min] = tmp;
        }
    }
}

int main()
{
    int a[] = {12,32,61,5,9,63,89,2};
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    selectSort(a,8);
    printf("\n");
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    return 0;
}

快速排序

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

void quickSort(int a[],int begin,int end){
    if(begin>=end) return;  //递归结束条件
    int i = begin,j = end,flag = a[i],tmp = 0;  //第一个为基准
    while(i!=j){
        while((i<j)&&(a[j]>flag)) j--; //从最后一个元素出发,每次循环j--,直到找到比flag小的数字,记录下标
        while((i<j)&&(a[i]<=flag)) i++;  //从开头元素出发,每次循环i++,直到找到比flag大的数字,记录下标
        if(j>i){  //交换
            tmp = a[i];
            a[i] = a[j];
            a[j] = tmp;
        }
    }
    a[begin] = a[i];
    a[i] = flag;  //交换基准数与i和j相遇的位置的数
    quickSort(a,begin,i-1);  //左子数组递归
    quickSort(a,i+1,end);   //右子数组递归
}

int main()
{
    int a[] = {12,32,61,5,9,63,89,2};
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    quickSort(a,0,7);
    printf("\n");
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    return 0;
}

希尔排序

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

void shellSort(int a[], int n){
	int i,j,gap;  // gap为步长,每次减为原来的一半
	for (gap = n / 2; gap > 0; gap /= 2){  // 共gap个数组,对每一组都执行直接插入排序
		for (i = 0; i < gap; i++) {
			for (j = i + gap; j < n; j += gap){  // 如果a[j]<a[j-gap],则寻找a[j]位置,并将后面的位置都后移
				if (a[j] < a[j - gap]){
					int tmp = a[j];
					int k = j - gap;
					while (k >= 0 && a[k] > tmp){
						a[k + gap] = a[k];
						k -= gap;
					}
					a[k + gap] = tmp;
				}
			}
		}
	}
}

int main()
{
    int a[] = {12,32,61,5,9,63,89,2};
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    shellSort(a,8);
    printf("\n");
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    return 0;
}

归并排序

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

void Merge(int arr[], int tmp[], int start,int mid, int end){//合并小组并排序
	int i = start;  //i标识,左小组的第一个元素位置
	int j = mid + 1;//j标识,右小组的第一个元素位置
	int k = start;  //tmp当前小组存放的起始位置
	while (i < mid + 1 && j < end + 1){//左小组越界或右小组越界才能退出
		if (arr[i] <= arr[j])
			tmp[k++] = arr[i++];
		else
			tmp[k++] = arr[j++];
	}
	while (j < end + 1){  //如果右边小组没有越界
		tmp[k++] = arr[j++];
	}
	while (i < mid + 1){  //如果左边小组没有越界
		tmp[k++] = arr[i++];
	}
	for (i = start; i <= end; i++){
		arr[i] = tmp[i];
	}
}

void MergeS(int arr[], int tmp[], int start, int end){//划分小组,现在没有end
	if (start < end){
		int mid = (start+end)/2;
		MergeS(arr, tmp, start, mid);
		MergeS(arr, tmp, mid + 1, end);
		Merge(arr, tmp, start, mid, end);
	}
}

void mergeSort(int arr[], int len){
	int *tmp = (int *)malloc(sizeof(int)*len);//开了一个排序后结果保存的临时数组
	MergeS(arr, tmp, 0, len - 1);//嵌套调用
	free(tmp);
}

int main()
{
    int a[] = {12,32,61,5,9,63,89,2};
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    mergeSort(a,8);
    printf("\n");
    for(int i=0;i<8;i++)
        printf("%d ",a[i]);
    return 0;
}

不同排序算法之间的比较:
在这里插入图片描述

以上属个人见解。
❤️希望对您有帮助,您的支持是我创作最大的动力!

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

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

相关文章

初识Java 18-3 泛型

目录 边界 通配符 编译器的能力范畴 逆变性 无界通配符 捕获转换 本笔记参考自&#xff1a; 《On Java 中文版》 边界 在泛型中&#xff0c;边界的作用是&#xff1a;在参数类型上增加限制。这么做可以强制执行应用泛型的类型规则&#xff0c;但还有一个更重要的潜在效果…

vue el-table (固定列+滚动列)【横向滚动条】确定滚动条是在列头还是列尾

效果图&#xff1a; 代码实现&#xff1a; html&#xff1a; <script src"//unpkg.com/vue2/dist/vue.js"></script> <script src"//unpkg.com/element-ui2.15.14/lib/index.js"></script> <div id"app" style&quo…

实战JVM高CPU、内存问题分析定位

背景&#xff1a; 业务中台组件MOSC开展压测工作&#xff0c;并发场景下发现CPU使用率达到100%&#xff0c;虽然程序没有报错&#xff0c;但是这种情况显然已经达到性能瓶颈&#xff0c;对服务带来了验证的效能影响&#xff0c;所以针对该CPU问题必须进行详细的根因分析处理。…

浅谈Python中的鸭子类型和猴子补丁

文章目录 前言一、鸭子类型二、猴子补丁关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前言 Python 开发者可能…

AdaBoost提升分类器性能

目录 AdaBoost算法原理 AdaBoost工作详情 初始权重分配 第一轮 第二轮 后续轮次 最终模型 AdaBoost的API解释 AdaBoost 对房价进行预测 AdaBoost 与决策树模型的比较 结论 AdaBoost算法原理 在数据挖掘中&#xff0c;分类算法可以说是核心算法&#xff0c;其中 Ada…

如何应用ChatGPT撰写、修改论文及工作报告,提供写作能力及优化工作??

如果我想让gpt从pdf文档中提取相关关键词的内容&#xff0c;可以怎么做呢&#xff1f;&#xff1f;我们评论区讨论 ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&am…

flink和机器学习模型的常用组合方式

背景 flink是一个低延迟高吞吐的系统&#xff0c;每秒处理的数据量高达数百万&#xff0c;而机器模型一般比较笨重&#xff0c;虽然功能强大&#xff0c;但是qps一般都比较低&#xff0c;日常工作中&#xff0c;我们一般是如何把flink和机器学习模型组合起来一起使用呢? fli…

9.Docker的虚悬镜像-Dangling Image

1.虚悬镜像的概念 虚悬镜像 (Dangling Image) 指的是仓库名 (镜像名) 和标签 TAG 都是 的镜像。 2.构建本地虚悬镜像 这里我以unbuntu为例来说明。 2.1 编写Dockerfile文件 FROM ubuntu:22.042.2 根据Dockerfile文件构建虚悬镜像 docker build .上面这段命令&#xff0c…

C#开发的OpenRA游戏之属性RenderSprites(8)

C#开发的OpenRA游戏之属性RenderSprites(8) 本文开始学习RenderSprites属性,这个属性是跟渲染有关的,因此它就摄及颜色相关的内容,所以我们先来学习一下调色板,这是旧游戏的图片文件保存的格式,如果放在现代来看,不会再采用这种方法,毕竟现在存储空间变大,便宜了,并…

做流体分析需要知道的两大核心问题:内流和外流

SOLIDWORKS Flow Simulation 是直观的流体力学 (CFD) 分析软件&#xff0c;可以快速轻松的分析产品内部或外部流体的流动情况&#xff0c;以用来改善产品性能和功能。SOLIDWORKS Flow Simulation将专业的流体分析进行功能优化&#xff0c;让普通机械设计师也能进行流体力学分析…

【Linux系统编程二十】:(进程通信2)--命名管道/共享内存

【Linux系统编程二十】&#xff1a;命名管道/共享内存 一.命名管道1.创建管道2.打开管道3.进行通信(server/client) 二.共享内存1.实现原理2.申请内存3.挂接4.通信5.去关联6.释放共享内存7.特性&#xff1a; 一.命名管道 上一篇介绍的一个管道是没有名字的 因为你打开那个文件…

在Python中调用imageJ开发

文章目录 一、在ImageJ中进行Python开发二、在Python中调用imageJ开发2.1、简介2.2、环境配置2.3、测试一2.4、测试二 Python imageJ 解决方案&#xff0c;采坑记录 一、在ImageJ中进行Python开发 原生ImageJ仅支持JS脚本&#xff08;JAVAScript&#xff09;&#xff0c;而Im…

蓝桥杯物联网竞赛_STM32L071_2_继电器控制

Stm32l071原理图&#xff1a; PA11与PA12连接着UNL2803 ULN2803是一种集成电路芯片&#xff0c;通常被用作高电压和高电流负载的驱动器。 ULN2803是一个达林顿阵列&#xff0c;当输入引脚&#xff08;IN1至IN8&#xff09;被连接到正电源时&#xff0c;相应的输出引脚&#xff…

大数据-计算框架选型与对比

计算框架选型与对比 一、大数据平台二、计算框架分类1.批处理架构2.实时流处理架构3.流批一体处理架构 三、计算框架关键指标1.处理模式2.可伸缩性3.消息传递3.1 至少一次&#xff08;at least once&#xff09;3.2 至多一次&#xff08;ai most once&#xff09;3.3 恰好一次&…

Redis报错:JedisConnectionException: Could not get a resource from the pool

1、问题描述&#xff1a; redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool 2、简要分析&#xff1a; redis.clients.util.Pool.getResource会从JedisPool实例池中返回一个可用的redis连接。分析源码可知JedisPool 继承了 r…

【git】使用ssh

前言 git之前一直使用https&#xff0c;因为很方便随时随地都可以用。最近把代码托管到GitHub&#xff0c;使用https就使用不了。后面听同事说GitHub使用ssh是没问题的&#xff0c;就想着尝试一下。 git ssh配置 设置用户名和邮箱 git config --global use.name username g…

FFmpeg常用命令讲解及实战二

文章目录 前言一、ffmpeg 常用命令1、ffmpeg 的封装转换2、ffmpeg 的编转码3、ffmpeg 的基本编转码原理 二、ffprobe 常用参数1、show_format2、show_frames3、show_streams4、print_format5、select_streams 三、ffplay 的常用命令1、ffplay 常用参数2、ffplay 高级参数3、ffp…

教你看现货黄金实时报价

现货黄金投资市场上的交易软件众多&#xff0c;很多人不知道选择什么软件好&#xff0c;但选择主流软件MT4&#xff0c;基本就可以满足投资者不同的需求。本文为大家讲讲&#xff0c;为什么有那么多的投资者&#xff0c;都选择通过MT4获取实时的行情报价。 现货黄金市场波动激烈…

什么是网络爬虫技术?它的重要用途有哪些?

网络爬虫&#xff08;Web Crawler&#xff09;是一种自动化的网页浏览程序&#xff0c;能够根据一定的规则和算法&#xff0c;从互联网上抓取和收集数据。网络爬虫技术是随着互联网的发展而逐渐成熟的一种技术&#xff0c;它在搜索引擎、数据挖掘、信息处理等领域发挥着越来越重…

【MySQL】子查询

文章目录 子查询IN运算符子查询 VS 连接ALL关键字ANY关键字相关子查询 !EXISTS运算符select子句中的子查询from子句中的子查询 子查询 获取价格大于id为3的货物的商品 用到了内查询&#xff0c;获取id为3的商品的单价&#xff0c;把结构传给外查询 在where子句中编写子查询&am…