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

news2024/11/17 10:05:21

这里,汇总了常见的排序算法具体代码实现。使用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;
}

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

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

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

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

相关文章

捷诚管理信息系统 SQL注入漏洞

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、产品介绍 捷诚管理信息系统是一款功能全面&#xff0c;可以支持自…

【独家发布】抖音半蓝V官方免费认证技术

先在巨量引擎升级dou账号 随后上传资料进行验证即可 逐步操作 全程实操保姆及教程 后续0粉点亮蓝v技术教程 来自&#xff1a;人类小徐-分享有价值的资源

构建个性化预约服务:预约上门服务系统源码解读与实战

随着社会的发展&#xff0c;预约上门服务系统在满足用户需求、提升服务效率方面发挥着越来越重要的作用。在本文中&#xff0c;我们将深入研究预约上门服务系统的源码&#xff0c;通过实际的技术代码示例&#xff0c;揭示系统内部的关键机制&#xff0c;以及如何在实际项目中应…

数据治理技术:研究现状与数据规范

随着信息技术的迅速发展,数据规模逐渐扩大&#xff0c;与此同时&#xff0c;劣质数据也随之而来&#xff0c;极大地降低了数据挖掘的质量&#xff0c;对信息社会造成了严重的困扰&#xff0c;劣质数据大量存在于很多领域和机构&#xff0c;国外权威机构的统计表明&#xff1a;美…

OpenSearch开发环境安装Docker和Docker-Compose两种方式

文章目录 简介常用请求创建映射写入数据查询数据其他 安装Docker方式安装OpenSearch安装OpenSearchDashboard Docker-Compose方式Docker-Compose安装1.设置主机环境2.下载docker-compose.yml文件3.启动docker-compose4.验证 问题问题1&#xff1a;IPv4 forwarding is disabled.…

完美解决:在Ubuntu18.04下ROS Melodic基于python3的cv_bridge的一点子歪门邪道

由于在Ubuntu18.04下ROS Melodic是运行在python 2.7环境下&#xff0c;而我的程序需要运行在anaconda创建的python 3.x环境里&#xff0c;这就需要用到cv_bridge这个库&#xff0c;而不出意外的&#xff0c;各种报错&#xff0c;比如&#xff1a; from cv_bridge.boost.cv_bri…

竞赛选题 题目:垃圾邮件(短信)分类 算法实现 机器学习 深度学习 开题

文章目录 1 前言2 垃圾短信/邮件 分类算法 原理2.1 常用的分类器 - 贝叶斯分类器 3 数据集介绍4 数据预处理5 特征提取6 训练分类器7 综合测试结果8 其他模型方法9 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器学习的垃圾邮件分类 该项目…

【RtpRtcp】3: webrtc m79:video 相关创建及切片、发送

m79 的 客户端代码流程。 对于视频帧: CreateRtpStreamSenders 管理一组RtpStreamSender ,每一个RtpStreamSender 都进行rtp包的发送: 具体发送是RTPSenderVideo 处理,RTPSenderVideo 对收到的h264 帧,进行帧分片rtp,然后一组包一起使用LogAndSendToNetwork 发送的。 Rtp…

解决vue中引入天地图显示不全问题,设置setTimeout即可解决!

index.html中引入天地图api <script type"text/javascript" src"https://api.tianditu.gov.cn/api?v4.0&tk你的key"></script>map.vue中初始化天地图 //初始化天地图 initTMap() {const T window.T;// 3.初始化地图对象this.tMap new…

探索WebStorm 2023 Mac/win:最强大的JavaScript开发工具

在当今的软件开发领域&#xff0c;JavaScript已经成为了一种不可或缺的编程语言。而在众多的JavaScript开发工具中&#xff0c;WebStorm一直以其强大的功能和友好的用户界面脱颖而出。现在&#xff0c;我们迎来了全新的WebStorm 2023版本&#xff0c;它将带给开发者们更加出色的…

Vue中使用Echarts实现数据可视化

文章目录 引言一、安装Echarts二、引入Echarts三、创建图表容器四、初始化Echarts实例五、配置图表选项和数据六、实现图表更新七、Vue实例代码结语我是将军&#xff0c;我一直都在&#xff0c;。&#xff01; 引言 接着上一篇内容&#xff0c;我将继续分享有关数据可视化的相…

VM CentOS7安装ffmpeg

项目中涉及给视频添加水印&#xff0c;使用到了ffmpeg&#xff0c;windows系统可直接使用&#xff0c;Linux需要手动编译完成ffmpeg后才可正常使用。 配置yum源: 备份原repo文件 cd /etc/yum.repos.d/mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.r…

从制造/金融/教育/医疗行业实战场景里,了解如何基于亚马逊云科技LLM相关工具打造知识库

背景 本篇将为大家阐述亚马逊云科技大语言模型下沉到具体行业进行场景以及实施案例的介绍&#xff0c;是亚马逊云科技官方《基于智能搜索和大模型打造企业下一代知识库》系列的第四篇博客。感兴趣的小伙伴可以进入官网深入了解其核心组件、快速部署指南以及LangChain集成及其在…

字符串匹配算法——KMP

有文本串aabaabaaf&#xff0c;模式串aabaaf问文本串中是否出现过模式串 暴力解法 最不用动脑子的&#xff0c;直接两层for循环&#xff0c;逐个匹配&#xff0c;匹配到不相等的值时把文本串后移一位&#xff0c;再重新比较。这种方法的复杂度是O(mn)&#xff0c;该方法低效的…

软件开发及交付的项目管理角色

在软件开发及交付过程中&#xff0c;通常会涉及不同的角色和职责&#xff0c;包括业务角色、技术角色和管理角色。这些角色在项目管理中发挥着不同的作用&#xff0c;以确保项目的成功和交付高质量的产品。 业务角色&#xff1a;包括产品经理、业务分析师和业务运营人员等职位…

Confluence Server Webwork 预身份验证 OGNL 注入 (CVE-2021-26084)

漏洞描述 Confluence 是由澳大利亚软件公司 Atlassian 开发的基于 Web 的企业 wiki。 存在一个 OGNL 注入漏洞&#xff0c;允许未经身份验证的攻击者在 Confluence Server 或 Data Center 实例上执行任意代码。 漏洞环境及利用 搭建docker环境 Confluence搭建见前文 Atlas…

网络层协议-IP协议

目录 基本概念IP协议格式分片与组装分片组装 网段划分特殊的IP地址IP地址的数量限制私有IP地址和公网IP地址路由 基本概念 TCP作为传输层控制协议&#xff0c;其保证的是数据传输的可靠性和传输效率&#xff0c;但TCP提供的仅仅是数据传输的策略&#xff0c;而真正负责数据在网…

Android JNI 异常定位(2)—— addr2line

Android native报错有时候只有一句 signal 11 (SIGSEGV)&#xff0c;这种情况仅通过log是很难定位到问题的。不过Android 在/data/tombstones目录保存了错误的堆栈信息&#xff0c;为定位bug提供了路径。不过一般这里的log都无法像java一样直接定位的出错的行数。如下图&#x…

Python“牵手”淘宝商品详情接口运营场景,淘宝商品详情接口调用指南

淘宝商品详情数据接口是淘宝开放平台提供的一个API接口&#xff0c;用于获取商品详细信息。通过这个接口&#xff0c;开发者可以根据商品ID或商品链接&#xff0c;获取该商品的详细信息&#xff0c;包括标题、价格、销量、描述等。 要使用淘宝商品详情接口&#xff0c;首先需要…

为什么程序员不直接用线上环境写代码呢?

为什么程序员不直接用线上环境写代码呢&#xff1f; 有的&#xff0c;我就是直接用Linux作为主力电脑使用&#xff0c;大概从201 6年起&#xff0c;我就开始这样干了。无论是编 程、画电路板、画UI、剪视频.... 都在Linux上面完成。 编程工具大部分都有Linux版本&#xff0c;…