C语言排序算法

C语言中三大经典的排序算法 掌握好常用的排序算法,在实际的项目开发中可以节省很多的时间。每一种排序算法在执行的效率上是存在差别的,这些微小的时间差,也许在平常的联系当中感觉不到,但是涉及到数据量比较大或者是在资源比较紧张的系统中就显得尤其的重要,比如嵌入式系统。下面简要介绍三种常用的排序算法以及他们的执行效率的比较。 冒泡排序: 思路:将相邻的两个数比较,将较小的数调到前头;有n个数就要进行n-1趟比较,第一次比较中要进 阅读详情

         通常,在排序过程中需要进行下列两种操作:(1)比较两个关键字的大小;(2)将记录从一个位置移到另一个位置。前一个操作对大多数排序方法来说都是必须的,而后一个操作可以通过改变记录的存储方式来予以避免。
         待排序的记录序列可有一下三种存储方式:(1)待排序的一组记录存储在地址连续的一组存储单元上。它类似于线性表的数序存储结构,在序列中相邻的两个记录Rj和Rj+1,它们的存储位置也相邻。在这种存储方式中,记录之间的次序关系由其存储位置决定,则实现排序必须借助移动记录;(2)一组待排序记录存放在静态链表中,记录之间的次序关系有指针表示,则实现不需要移动记录,仅需修改指针即可;(3)待排序记录本身存储在一组地址连续的存储单元,同时另设一个指示各个记录存储位置的地址向量,在排序过程中不易懂记录本身,而移动地址向量中这些记录的“地址”,在排序结束后再按照地址向量中的值调整记录的存储位置。在第二种存储方式下实现的排序又称(链)表排序,在第三种排序方式下实现的排序又称为地址排序。


       直接插入排序(Straight Insert Sort)是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。

void SInsertSort(ArrayType R[], int n)
{
	int i, j, temp;
	for(i=1;i<n;i++) //i从第二个元素开始
	{
		temp = R[i];   //将待排序元素放入临时变量
		j = i-1;      //从第i个元素的前一个元素开始查找
		while((temp<R[j]) && (j>=0))
		{
			R[j+1] = R[j];   //元素向后移动
			j--;     //向左继续查找
		}
		R[j+1] = temp;  //将元素插入相应位置
	}
}

      折半插入排序(Binary Insertion Sort)是利用二元搜索的方法对每一个R[i]找其插入位置。具体实现是用两个指针:一个头指针h,初始指向第一个记录;一个尾指针t,初始指向带插入记录的前面一个位置。每次将待插记录的关键字与它前面一段的中间位置的关键字比较,确定待插记录的位置。

void BInsertSort(ArrayType R[], int n)
{
	int i, j, temp, middle;
	int head, tail;
	for(i=1;i<n;i++)
	{
		temp = R[i];
		head = 1;   //在R[head]到R[tail]中折半查找插入位置
		tail = i - 1;
		while(head <= tail)
		{
			middle = (head + tail)/2;   //折半
			if(temp < R[middle])
				tail = m-1;      //插入点在低半区
			else
				head = m+1;      //插入点在高半区
		}
		for(j = i-1;j >= tail+1;--j)  //将tail之后的元素后移
			R[j+1] = R[j];
		R[tail + 1] = temp;    //插入
	}
}

选择排序:

void selectSort(int *x, int n)
{
	int i, j, min, t;
	for(i=0; i<n-1; i++)//要选择的次数
	{
		min = i;
		for(j=i+1; j<n; j++)//找出最小的数的下标
		{
			if(*(x+j) < *(x+min))
				{
					min = j;
				}
		}
		if(min != i)
			{
				t = *(x+i);
				*(x+i) = *(x+min);
				*(x+min) = t;
			}
	}
}

冒泡排序:
void bubbleSort(int *x, int n)
{
	int j, k, h, t;
	int flag=1;
	for(h=n-1; h>0; h=k) //一直循环到没有比较范围
	{
		for(j=0,k=0; j<h; j++) //每次预设k=0,循环扫描完成后更新k
		{
			if(*(x+j)>*(x+j+1))  //大的沉下去,小的浮上来
				{
					t = *(x+j);
					*(x+j) = *(x+j+1);
					*(x+j+1) = t;
					k = j; //保存最后下沉位置,这样k后面的都是排序完成的
					flag = 0; 
				}
		}
		if(flag)
			{
				break; //如果一次都未交换,说明已经排好序
			}
	}
}

希尔排序:
void shellSort(int *x, int n)
{
	int h, j, k, t;
	for(h=n/2; h>0; h/=2) //控制增量
	{
		for(j=h; j<n; j++)  //这个实际就是直接插入排序
		{
			t = *(x+j);
			for(k=j-h; k>=0&&t<*(x+k); k-=h)
			{
				*(x+k+h) = *(x+k);
			}
			*(x+k+h) = t;
		}
	}
}

快速排序:
void quickSort(int *x, int low, int high)
{
	int i, j, t;
	if(low < high) //要排序元素的下标,以下标为low的元素为基准点
		{
			i = low;
			j = high;
			t = *(x+low); //暂存基准点的数
			while(i<j)
			{
				while(i<j && *(x+j)>t)
				//在右边的,只要比基准点大的元素仍放在右边
				{
					j--; //前移一个位置
				}
				if(i<j)
					{
						*(x+i) = *(x+j);
						//上面的循环退出,即出现比基准点小的数,替换左边的数
						i++; //后移一个位置
					}
				while(i<j && *(x+i)<=t)
				//在基准点左边的数,只要比基准点小的元素仍放在左边
				{
					i++;
				}
				if(i<j)
					{
						*(x+j) = *(x+i);
						j--;
					}
			}
			*(x+i) = t;//放入适当位置
			quickSort(x, low, i-1);//对基准点左边的数进行快排
			quickSort(x, i+1, high);//对基准点右边的数进行快排
		}
}

以上仅仅写出了大体算法,由于没有实际编译,所以不排除有细节问题,如有发现,请指正,谢谢。

C语言实现六大经典排序算法 排序算法是计算机科学中的基础概念,它们对数据进行有效组织,以便数据可以更快地被访问、检索和处理。排序不仅可以单独作为一个算法任务出现,还是其他更复杂问题解决方案的基石。本章将概述排序算法的重要性、基本原理和分类,并为接下来对不同排序算法更深入的讨论做铺垫。排序算法按照数据比较的方式可以分为两大类:比较排序和非比较排序。比较排序通过比较两个数据元素的大小来决定它们的顺序,例如快速排序、归并排序等;非比较排序则不通过元素间的比较来确定元素顺序,比如计数排序、基数排序等。 阅读详情

相关推荐

Palantir Vertex:数字孪生模拟与决策系统深度指南

Palantir Vertex是Foundry系统中的核心数字孪生模块,本质上是一个决策模拟器而非简单的数据可视化工具。它基于本体层构建,通过对象关系网络模拟现实世界实体,填补数据模型与业务决策间的鸿沟。核心功能包括:创建隔离的沙盒场景进行假设测试、修改参数模拟不同干预方案、对比虚实数据发现异常,并最终将最优决策回传至业务系统。典型应用场景涵盖供应链韧性评估、资产维护优化和应急方案制定等,帮助用户在复杂环境中做出更优决策。

轩哥的个人研究和成长记录 891

C语言-直接插入排序算法

直接 插入排序 (Straight Insertion Sort)是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。. 废话不多说先看看代码 #define _CRT_SECURE_NO_WARNINGS 1 //直接插入排序法 #include <stdio.h> void Compare(int arr[], int len) { int i = 0; for (i = 0; i < len-1; i++)//l

weixin_63246064的博客 6196

电磁场可视化

电磁场可视化 如题,做了电磁场可视化这么久了,也是颇有些心得了,简单描述一下怎么做这个项目的。 开始时是从最基本的OpenGL开始做的,必不可少的翻了许多的文献,后来是直接在unity中做,发现效果挺好,而且可控性强好多。反复琢磨后,发现可视化的渲染,有几种思路,第一就是用linerender,画线的方法,另一种就是用shader。 第一种我通过unity自带的linewave插件可以做到 详细的就是,linewave插件可以轻松画出曲线等,并且可以添加碰撞,控制频率幅度长度等一切的条件数值,而且令人惊喜

weixin_43979140的博客 1671

C语言的5种简单排序算法

基本概要: 本文主要介绍五种简单常用的排序算法:冒泡排序,快速排序,插入排序,选择排序,希尔排序,包括它们的基本思想和代码实现。值得一说的是:插入排序,冒泡排序,选择排序平均情况下的时间复杂度为,因此在排序数据较少的情况下较好;而希尔排序和快速排序的平均时间复杂度为,因此在排序数据较多的情况下较好,但是对于快速排序而言,数据基本有序时反而不好,接下来会详细阐述。 1.冒泡排序(Bubble Sort) 基本思想: 冒泡排序是一个非常好理解的排序,顾名思义——冒泡,此时将要排序的数据从上至下排列,从最

Finecsr的博客 6万+

手把手教你搭建幽冥传奇手游:从环境配置到常见Bug修复(附完整避坑指南)

本文详细指导如何从零搭建幽冥传奇手游,涵盖服务器选型、数据库部署、双区架构配置等关键步骤,并提供通天塔闪退、技能显示异常等常见Bug的修复方案。附完整避坑指南,帮助开发者高效解决90%的典型问题,确保游戏稳定运行。

weixin_29232121的博客 244

Android手机免root玩转Kali NetHunter:Termux保姆级安装指南(附Kex VNC配置)

本文提供了一份详细的Android手机免root安装Kali NetHunter的保姆级指南。通过使用Termux终端模拟器,用户无需解锁Bootloader或获取root权限,即可在普通安卓设备上部署完整的Kali Linux渗透测试环境。教程涵盖了从环境准备、NetHunter核心安装到配置Kex VNC实现图形桌面访问的全过程,并附带了电脑投屏与常见问题解决方案,旨在打造一个便携的移动安全学习与测试平台。

weixin_29208327的博客 297

C语言实现12种排序算法

用C语言完整实现12种排序方法

yishuihanq的博客 9336

EPLAN 设备接线图模板制作

属性摆放 设备连接图设置(选项 - - 设置) 连接图生成

weixin_36447711的博客 7865

十大排序算法——C语言实现

十大排序 C语言实现 都可直接运行

qq_45958551的博客 3731

RS485差分信号A下拉B上拉导致的乱码问题:一个硬件工程师的踩坑实录

本文通过一个工业网关项目中的RS485通信乱码故障,深入剖析了差分信号偏置电路设计的核心要点。文章详细记录了从波形抓取、原理图分析到多节点冲突排查的全过程,重点揭示了A下拉、B上拉这一反常规配置如何导致总线空闲状态不稳定,进而引发数据包末尾多出0x00字节及前导乱码的问题,并最终给出了硬件与软件协同的系统级解决方案与设计准则。

weixin_29159441的博客 236

APK静态分析(取证角度)——理论部分

APP是指应用程序(Application),是指能够在手机、平板电脑、电脑等移动设备上运行的软件。APP可以帮助用户进行各种功能操作,如社交媒体、游戏、购物、学习、工作等。用户可以通过应用商店或者在线下载安装APP,然后在设备上使用它们。APP的种类非常丰富,能够满足用户不同的需求和兴趣。

currify的博客 3208

C 语言排序算法

帮助你快速理解排序算法

qq_52184758的博客 1443

Python 爬虫实战:就业市场趋势数据抓取与行业洞察

在当今竞争激烈的就业市场中,了解行业趋势和就业形势对于求职者、学生以及人力资源专业人士来说至关重要。通过获取和分析就业市场数据,我们可以深入了解不同行业的招聘需求、薪资水平、技能要求等关键信息,从而为职业规划和人才发展提供有力支持。

yansideyucsdn的博客 1406

C语言:排序算法

排序算法可分为三大类:时间复杂度为O(n²)的基础算法(冒泡、选择、插入排序),O(nlogn)的高效算法(快速、归并、堆排序),以及特定条件下的线性时间算法(计数、基数排序)。算法选择需综合考虑时间复杂度、空间复杂度、稳定性及应用场景:小规模数据适合插入排序,中等规模优先选用快速排序,大规模数据可考虑归并或堆排序,整数排序则适用计数/基数排序。各种算法在交换次数、额外空间需求和稳定性方面各具特点,实际应用中需根据数据特征选择最优方案。

空白的笔记记录,希望有用 950

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C语言之十大经典排序算法

嗨喽,大家好,我是程序猿老王,程序猿老王就是我。今天给大家讲一讲C语言十大经典排序算法原理与实现。

Wang_XB_3434的博客 1112

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

经典的十种排序算法 C语言版

简要的介绍几种排序算法

Johnny-He的博客 1万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C语言排序算法详解

排序算法平均时间复杂度最坏时间复杂度最好时间复杂度空间复杂度稳定性冒泡排序On2O(n^2)On2On2O(n^2)On2OnO(n)OnO1O(1)O1稳定选择排序On2O(n^2)On2On2O(n^2)On2On2O(n^2)On2O1O(1)O1不稳定插入排序On2O(n^2)On2On2O(n^2)On2OnO(n)OnO1O(1)O1稳定快速排序On。

qq_45315034的博客 1266

八种排序算法【C语言实现】

八种排序算法【C语言实现】

2301_80667728的博客 2999

c语言合并排序算法_合并排序算法

c语言合并排序算法 合并排序算法 (Merge Sort Algorithm) Merge Sort follows the rule of Divide and Conquer to sort a given set of numbers/elements, recursively, hence consuming less time. 合并排序遵循分而治之的规则,以递归方式对一组给定的数字...

cunfen6312的博客 5800

C语言实现六种排序算法

C语言实现六种排序算法C语言实现六种排序算法冒泡排序 插入排序 归并排序 快速排序 希尔排序 选择排序下载完整源代码冒泡排序从左到右依次比较相邻两个元素,如果大的在左边则交换这两个元素。 如果在依次遍历中执行过交换操作,则再次遍历,直到不发生元素交换。int * sortByMaopao(int * num,int length) { bool flag=true; while(f

CodeMan 5369

c语言字典序排序算法_C语言八大排序算法

一前言如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。二八大排序算法排序算法作为数据结构的重要部分,系统地学习一下是很有必要的。1、排序的概念排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。排序分为内部排序和外部排序。若整个排序过程不需要访问外存便能完成,则称此类...

weixin_32390279的博客 2687

C语言排序算法总结

在乱序的一维数组中,固定第1个位置的数字,从第2个位置的数字开始,从左到右依次与位置1处数字进行大小比较,一轮比较结束后,将最小的数字放在数组的第一个位置,之后以此类推,固定第n个位置数字,从第(n+1)个位置数字开始,从左到右依次与位置n处数字进行大小比较,本轮比较结束后,将本轮中最小的数字放在数组的第n个位置。在乱序的一维数组中,从第1个位置的数字开始,从左到右依次将左右相邻位置数字的大小进行比较,若后者大于前者,交换两个位置的数字,排列一轮后,数组中的最大值被排在了数组的最后一个位置,之后以此类推。

qq_47798402的博客 3082
上一篇: 黑客的基本知识及常用入侵手段
下一篇: 不用鼠标操作windows
lniwn
博客等级 码龄16年 33粉丝 59原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值