实用算法实践-第1篇 排序

【数据结构与算法】——排序算法篇 由于研究生考试的需要,加上我对算法的情有独钟,这段时间一直在研究算法。跟大家分享一些我的经验和想法:一、欢迎大家批评指正我错误的地方;二、欢迎大家补偿自己的见解进来,我如果发现有独到见解的评论,我会编辑添加到文章中来,并注明。希望给大家带来好的知识分享!     为什么我们需要排序?存放数据就像我们在日常生活中存放东西一样,时不时需要整理一下,你下次拿东西的时候才方便。如果你的东西是一堆乱麻,你 阅读详情

1.1    选择排序

许多排序算法比选择排序快多了,但是选择排序能够将排序的交换次数降到最少,这是它比冒泡排序的优点之所在。通过下面这个实例就可以深刻认识这一点。

1.1.1   实例

PKU JudgeOnline, 1674, Sorting by Swapping.

1.2    库函数的应用

快速排序函数qsort()非常好用,下面就是一些应用例子。

据说,STL的sort()函数比stdlib.h 的qsort()函数快。

1.2.1   库函数排序整数数组

#include <stdlib.h>
int cmp(const void*p1, const void*p2)
{
    return *(int *)p1 - *(int*)p2;
}
qsort(&people[1],N, sizeof(people[0]), cmp);

上面的cmp函数中如果p1-p2则是非降序,如果p2-p1则是非升序。

1.2.2   库函数排序字符串数组

char word[1002][21];
int cmp(const void*p1, const void*p2)
{
     return strcmp((char*) p1,(char*)p2);
}
qsort(&word[0],num, 21 * sizeof(char),cmp);

1.2.3   库函数排序结构体数组

1.2.4   实例

PKU JudgeOnline, 3664, Election Time.

1.2.5   问题描述

N个牛的选举分为两个阶段,第一阶段得票最高的前K个进入第二阶段,第二阶段得票最高的获胜。先输入N、K,然后是N对两阶段得票数。问哪只牛获胜。

1.2.6   输入

53

310

92

56

84

65

 

1.2.7   输出

5

1.2.8   程序

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include <iostream.h>
struct Node
{
     int data1;
     int data2;
     int pos;
};
int cmp1(const void*p1, const void*p2)
{
    return(*(Node *)p2).data1 > (*(Node *)p1).data1 ? 1 : -1;
}
int cmp2(const void*p1, const void*p2)
{
    return(*(Node *)p2).data2 > (*(Node *)p1).data2 ? 1 : -1;
}
Nodefirst[50001];
int main()
{
     int i;
     int N, K;
     while(cin>> N >> K){
         for(i =0; i < N; i++){
              scanf("%d%d",&first[i].data1, &first[i].data2);
              first[i].pos = i + 1;
         }
         qsort(first, N,sizeof(first[0]),cmp1);
/*       for(i = 0; i< N; i++){
              cout<<first[i].pos<<" : "<<first[i].data1<<": "<<first[i].data2<<endl;
         }*/
         qsort(first, K,sizeof(first[0]),cmp2);
/*       for(i = 0; i< N; i++){
              cout<<first[i].pos<<" : "<<first[i].data1<<": "<<first[i].data2<<endl;
         }*/
         cout << first[0].pos<<endl;
     }
     return 1;
}

1.3    快速排序的随机化

并不是所有的输入数据的所有排列都是等可能的。为了使得算法能获得较好的平均情况性能,可以加入随机化成分。

1.3.1   程序(未测试)

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define maxNum 10001
#define ONLINE_JUDGE 0
struct cow{
	int S;
	int E;
	//int sequence;
	//牛的编号,也就是在输入数据的第几个,
	//因为在输出的时候需要按照编号大小依次输出值
	//又因为cow不发生变化,所以可以不存
};
cow cow[maxNum];
int pos[maxNum];
//在排序之后第i大的数是cow数组的第pos[i]个元素
//在任何时候,cow都不会变化。
//所有排序都需要通过调整pos数组的指向来进行。
int cmp(int i, int j)
{
	int Si;
	int Sj;
	int Ei;
	int Ej;
	Ei = cow[pos[i]].E;
	Ej = cow[pos[j]].E;
	Si = cow[pos[i]].S;
	Sj = cow[pos[j]].S;/*
	if(Si > Sj){
		return 1;
	}else{
		return -1;
	}*/
	if(Si <= Sj && Ej <= Ei && Ei - Si > Ej - Sj){
		return 1;
	}else{
		return -1;
	}
}
int sequence[maxNum];
//pos数组的“逆”,即若pos[i] = j,那么sequence[j] = i;
//通过sequence数组数组,可以知道cow数组的第i个元素于第sequence[i]名
void exchange(int i, int j)
{
	int temp;
	sequence[pos[i]] = j;
	sequence[pos[j]] = i;
	temp = pos[i];
	pos[i] = pos[j];
	pos[j] = temp;
}
int Partition(int p, int r)
{
	int i;
	int j;
	int x;
	x = r;
	i = p - 1;
	for(j = p; j < r; j++){
		if(cmp(x, j) > 0)//(cow[j] <= x)
		{
			i++;
			exchange(i, j);
		}
	}
	exchange(i + 1, r);
	return i + 1;
}
int randPartition(int p, int r)
{
	int i;
	i = (rand() % (r - p)) + p;
	exchange(i, r);
	return Partition(p, r);
}
void randQsort(int p, int r)
{
	int q;
	if(p < r)
	{
		q = randPartition(p, r);
		randQsort(p, q - 1);
		randQsort(q + 1, r);
	}
}
int main()
{
#ifndef ONLINE_JUDGE     
	FILE *fin;

	fin = freopen( "test.txt", "r", stdin);
	if( !fin )
	{
		printf( "reopen in file failed...\n");   
		while(1){}
		return 0;
	}
	freopen( "out.txt", "w", stdout);
#endif
	int i;
	int j;
	int N;
	int result;
	while(scanf("%d", &N)){
		if(N == 0)
		{
			break;
		}
		for(i = 0; i < N; i++){
			scanf("%d%d", &cow[i].S, &cow[i].E);
			sequence[i] = i;
			pos[i] = i;
		}
		randQsort(0, N - 1);
		for(i = 0; i < N - 1; i++){
			//printf("%d %d\n", cow[pos[i]].S, cow[pos[i]].E);
			result = sequence[i];			
			for(j = result + 1; j < N; j++)
			{
				if(cmp(j, result) > 0)
				{
					break;
				}
			}
			result = N - j;
			printf("%d ", result);
		}
		printf("0\n");
	}
#ifndef ONLINE_JUDGE   
//	fclose(stdout);
	fclose(stdin);
#endif
	return 1;
}

1.4    计数排序

《算法导论》中计数排序的伪代码如下所示:

注意:10行和11行弄得这么复杂的原因是为了维持计数排序的稳定性。计数排序的稳定性对于使用该排序的基数排序的正确性来说非常重要。
计数排序的算法时间复杂度是Θ(k + n)。可以证明基于比较的排序算法下界为Ω(n lgn)。线性时间的排序算法不是基于比较的排序算法。

1.5    基数排序

虽然基数排序的时间复杂度是Θ(n),但是由于Θ记号中隐藏了常数因子的影响,所以比较基数排序和基于比较的排序算法的好坏需要考虑以下几个因素:

1. 算法的实现特性。排序算法通常可以比基数排序更为有效地利用硬件缓存。

2. 输入数据的特性。

3. 内存的速度。如果基数排序利用计数排序作为中间稳定排序,那么它就不是一个原地排序,而很多的Θ(n lgn)时间的比较排序算法可以做到原地排序。故此,如果内存容量比较宝贵,则原地排序算法比较可取。

一个非常好地利用了基数排序的例子是后缀数组的Skew构造算法。

1.6    实例

PKU JudgeOnline, 3664, Election Time.

PKU JudgeOnline, 3404, Bridge over a roughriver

PKU JudgeOnline, 1700, Crossing River.

PKU JudgeOnline, 3637, Shopaholic.

PKU JudgeOnline, 1674, Sorting by Swapping.

PKU JudgeOnline, 2231, Moo Volume.
本文章欢迎转载,请保留原始博客链接http://blog.youkuaiyun.com/fsdev/article

数据结构与算法:排序算法的实用指南 排序是计算机科学中最基本、最重要的操作之一。本文旨在为读者提供一份全面的排序算法指南,涵盖从基础到高级的各种排序技术。我们将探讨算法的理论背景、实际实现、性能分析以及在不同场景下的应用选择。文章首先介绍排序算法的基本概念和分类,然后详细分析各种排序算法,包括它们的原理、实现和性能特点。接着通过实际代码示例展示如何实现这些算法,最后讨论实际应用和未来发展趋势。排序算法:将一组数据按照特定顺序重新排列的算法时间复杂度:算法执行所需时间与输入规模的关系空间复杂度:算法执行所需额外空间与输入规模的关系稳定性。 阅读详情

相关推荐

34.写一个排序算法1-100随机数字进行排序

编程题目: 34.写一个排序算法 1-100随机数字 进行排序,要求效率。 示例代码: package program.calculation.exercise34; /** * 34.写一个排序算法 1-100随机数字(不重复),进行排序,要求效率。 * 冒泡排序时间复杂度:O(n2) * 快速排序时间复杂度:O(nlog2 n) 效率高 * */ public class Sor...

SC的博客 4867

双目立体视觉-SGM匹配算法-P1、P2参数影响分析

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言二、使用步骤1.引入库2.读入数据总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 笔者在学习以及应用

weixin_45541495的博客 2158

Go语言实现经典排序算法:并发排序实践

排序算法是计算机科学中最基础且重要的算法之一,广泛应用于各种领域,如数据处理、搜索算法、数据库管理等。在处理大规模数据时,排序算法的性能至关重要。Go语言作为一种现代的编程语言,具有强大的并发编程能力,能够充分利用多核处理器的性能。本文的目的是研究如何使用Go语言实现经典排序算法,并通过并发编程的方式优化排序算法的性能。本文的范围涵盖了常见的经典排序算法,如冒泡排序、选择排序、插入排序、快速排序、归并排序等,以及如何利用Go语言的goroutine和channel实现并发排序。

AI天才研究院 879

C语言程序概述(五)

C程序设计第10章:指 针

shuyingcanyueye的博客 792

掌握排序算法:从基础到实践

时间复杂度是评估算法效率的主要指标之一,它描述了算法执行时间与输入数据规模之间的关系。在算法理论中,我们通常用大O表示法(Big O notation)来表示时间复杂度,它提供了一个上界,用来描述最坏情况下的运行时间。具体来说,时间复杂度关注的是算法运行次数随着输入规模n的增长而增长的趋势。比如,如果一个算法的运行时间与输入规模n成正比,则我们说这个算法具有线性时间复杂度O(n)。

weixin_30481539的博客 720

Windows系统下LaTeX环境搭建与编辑器配置全攻略

本文详细介绍了在Windows系统下搭建LaTeX环境的完整流程,包括TeX Live的安装、TeXStudio编辑器的配置优化以及常见问题排查。特别针对中文用户推荐使用清华镜像源加速下载,并提供了XeLaTeX编译器配置、中文支持等实用技巧,帮助用户快速上手LaTeX文档编写。

weixin_42554408的博客 449

【数据结构笔记】数据结构基础—排序

1.排序的原理 稳定排序和非稳定排序 设文件f=(R1……Ri……Rj……Rn)中记录Ri、Rj(i≠j,i、j=1……n)的key相等,即Ki=Kj。 若在排序前Ri领先于Rj,排序后Ri仍领先于Rj,则称这种排序是稳定的,其含义是它没有破坏原本已有序的次序。 内排序和外排序 若待排文件f在计算机的内存储器中,且排序过程也在内存中进行,称这种排序为内排序。 若排序中的文件存入外存储器,排序过程借助于内外存数据交换(或归并)来完成,...

段昊东的博客 271

深入理解梅尔刻度、梅尔滤波器组和梅尔时频谱图

读取一段音频,使用短时傅里叶变换,得到普通的时频谱图,然后绘制梅尔滤波器组,值得注意的是,librosa的梅尔滤波器组函数还带有权重归一化功能,即对一个三角形滤波器的每个权重,都除以该三角形的面积,如果不希望进行该归一化,设置参数。从公式可见,对数部分可以以自然对数为底数,也可以以10为底数,不同的底数对应不同的系数,要确定当前的系数,只需要代入(1000Hz, 1000mel)即可。其中,m是当前滤波器的序号,表征了当前的时间段,k是当前频率的序号,表征了当前正在对哪一频率的。

DEDSEC_Roger的博客 1万+

实用算法实践-第1篇 排序 .

1.1    选择排序 许多排序算法比选择排序快多了,但是选择排序能够将排序的交换次数降到最少,这是它比冒泡排序的优点之所在。通过下面这个实例就可以深刻认识这一点。 1.1.1   实例 PKU JudgeOnline, 1674, Sorting by Swapping. 1.2    库函数的应用 快速排序函数qsort()非常好用,下面就是一些应用例子。 据说,STL的sor

440

斑马打印机状态监控进阶:不用SDK也能获取打印状态的3种野路子

本文介绍了三种不依赖官方SDK的斑马打印机状态监控方法,包括SGD命令、TCP端口嗅探和共享打印机日志分析。这些方案适用于老旧系统或网络受限环境,帮助运维人员实时掌握打印状态,提升设备管理效率。特别适合工业自动化和物流仓储场景中的应急处理。

weixin_42628688的博客 427

麒麟linux离线源码编译安装zabbix-agent

离线源码编译安装zabbix-agent

qq_37263429的博客 2268

【排序算法篇】---直接插入排序

直接插入排序详细讲解

意疏的博客 2667

Frigate进阶玩法:如何用MQTT和Python脚本扩展你的自定义目标检测算法

本文详细介绍了如何通过MQTT和Python脚本扩展Frigate的自定义目标检测算法,无需修改源码即可实现特殊场景(如工业设备异常、农业病虫害识别)的高效检测。文章涵盖Frigate配置、外部检测服务构建、高级集成技巧及性能优化实践,帮助开发者灵活扩展智能监控能力。

weixin_42662293的博客 350

【排序算法】总结篇

排序对比

SWsunlight的博客 1225

burpsuite抓取ios数据包

1:首先在burpsuite中设置 添加proxy listeners 2:电脑开热点,手机连接,把代理设为电脑的ip和代理的端口 3:在Safari浏览器中打开网址http://burp下载证书 4:打开设置->通用->描述文件与设备管理 5:设置->通用->关于本机->证书信任设置 之后就可以正常抓包了 ...

weixin_45682070的博客 2065

FPGA原型验证(七):如何选择、搭建原型验证平台?

本篇概要::讨论了在项目初期选择目标FPGA平台的重要性,包括自制板卡与购买现成板卡之间的决策。主要是为那些希望建立基于FPGA的原型平台的工程师和设计师提供了深入的技术细节和决策指导,无论是选择自制还是购买现成的解决方案。

叫好与叫座虽然不是对立面,但想在同一个作品中达到双重效果很难。 943

实用的排序算法 - 交换排序

Ⅰ、写在前面前面写了关于ADC采集电压的文章,大家除了求平均的方式来处理采样值,还有没有使用到其他的方式来处理采集值呢? 在某些情况下就需要对一组数据进行排序,并提取头特定的数据出来使用。 排序的应用场合很多,我这里就不再一一举例说明,掌握排序的基本算法,到时候遇到就有用武之地。 Ⅱ、排序算法分类1.按存储分类:内部排序和外部排序内部排序:是数据记录在内存中进行排序; 外部排序:是因排序的数据很大

strongerHuang 4532

【OpenClaw从入门到精通】第05篇:实战!OpenClaw自动化搞定邮件/日历/文件管理(2026实测避坑版)

本文聚焦OpenClaw核心实用场景,手把手教你实现邮件、日历、文件管理的全自动化。通过安装三大核心技能,配置IMAP/SMTP邮箱、跨平台日历及文件沙盒权限,结合4个虚拟实战案例,演示从邮件自动摘要、会议冲突预警到下载文件夹分类的完整流程。文中包含2026实测的命令代码、配置步骤、排障方案,所有案例需在测试环境验证,代码未上传GitHub。兼顾新手入门与进阶需求,让OpenClaw从“能聊天”升级为“能干活”,帮你节省80%重复工作时间。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2676

实用算法实践-第 3 篇 堆排序

虽然堆排序算法是一个很漂亮的算法,但是在实际中,快排序的一个好的实现往往优于堆排序。尽管这样堆数据结构还有很大的用处,例如优先级队列。 3.1    最小堆 下面的程序就是按照《算法导论》最小堆的优先级队列的实现,修改几个小于号(大于号)可以轻易地将最小堆变成最大堆。 最小堆的一个用法实例是在Huffman编码中。 3.1.1   最小堆的优先级队列程序 #include #inc

李希的博客 935

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

总结篇:排序算法

本文旨在于以通俗易懂地方式阐述主要排序算法及其特点!

m0_61661179的博客 6万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

算法学习篇1——排序

排序算法是算法学习的基础,不同的排序算法各有优缺点和适用场景。理解各种排序算法的原理和性能特点,能够帮助我们在实际开发中选择最合适的排序方法。对于初学者来说,建议从简单的冒泡排序、插入排序开始理解排序的基本思想,然后逐步学习更高效的快速排序、归并排序等算法。掌握这些经典排序算法不仅能解决实际问题,也是进一步学习更复杂算法的基础。

a19884792066的博客 716

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

排序算法终极篇之手撕常见排序算法

本编文章详解常见七大大排序(插入排序、希尔排序、选择排序、冒泡排序、堆排序、快速排序、归并排序),其中快速排序和归并排序递归实现是我们常见的思路,但是非递归实现的情况相对少见,理解起来也会有点难度,本篇文章会给出详解!详解+动图+代码帮助你理解到位,快进来学习吧!

weixin_67596609的博客 1659

算法 排序1 排序

全部每周作业和视频思考题答案和解析见浙江大学 数据结构 思考题+每周练习答案 题目:给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。 本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下: 数据1:只有1个元素; 数据2:11个不相同的整数,测试基本正确性; 数据3:10^3个随机整数; 数据4:10^4个随机整数; 数据5:10^5个随机整数...

Dezeming的博客 6950

算法之排序篇介绍

算法之排序篇介绍 文章目录算法之排序篇介绍一、认识时间复杂度?题目一:在一个数组中找到数组的最大值题目二、选择排序(时间:O(N^2) 空间:O(1))题目三:在一个已经排好序的数组中,找到目标值aim题目四:找到两个已经排好序的数组中的公有数字二、认识空间复杂度?题目一:实现数组的下列变换三、经典排序算法的实现?1、冒泡排序2、插入排序3、选择排序4、归并排序5、快速排序6、堆排序7、对数器的实现作用:对数器是用来干什么的呢?总结 一、认识时间复杂度? 时间复杂度为,一个算法流程中,常数操作数量的指

weixin_44003391的博客 1878

排序算法集群之理论篇

排序算法集群之理论篇

T_iAn_T的博客 723
下一篇: 实用算法实践-第 2 篇 有序数组的二分查找
存储李希
博客等级 码龄15年 418粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值