【HDU 1425】 一个案例明白冒泡排序和快速排序

简介: 【HDU 1425】 一个案例明白冒泡排序和快速排序

详解冒泡排序和快速排序

一般而言,竞赛所给的题目一般都会有多种的解法,它考核的是再限定的时间和空间内解决问题。

如果条件很宽松,那么可以在多种解法中选择一个最容易编程的算法;如果给的条件比较苛刻,那么能选择的合适算法就不多了。

下面使用一个例子来说明同样的问题如何选择不同的算法。


给出 n 个整数,请按从大到小的顺序输出其中前 m 大的数。

输入:每组测试数据有两行,第1行有两个数 n 和 m (0< n , m <1000000),第2行包含 n 个各不相同,且都处于区

间[-500000,500000]的整数。

输出:对每组測试数据接从大到小的顺序输出前大的数。

输入样例:

5 3

3 -35 92 213 -644

输出样例:

213 92 3


该题的思路是先对 100 万个数排序,然后输出前m大的数字。题目给出了代码运行时间,非Java语言的时间为 1s,内存为 32MB。


下面分别用冒泡排序、快速排序 2 种算法编程。


1、冒泡排序

首先用最简单的冒泡算法求解上面的问题。

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int n,m;
int s[1000001];
void bubble_sort() {
  for (int i = 0; i < n-1; i++) {
    for (int j = 0; j < n - i - 1; j++)
      if (s[j] > s[j + 1]){
        int temp = s[j];
        s[j] = s[j + 1];
        s[j + 1] = temp;
      } 
  }
}
int main() {
    while (~scanf("%d %d",&n,&m)){
      for (int i = 0; i < n;i++) scanf("%d", &s[i]);
    bubble_sort();
    for (int i = n-1; i >= n-m;i--) {
      printf("%d ", s[i]);
    }
  }
  return 0;
}

在bubble_sort()运行后,得到从小到大的排序结果,然后从后往前打印前m大的数字。

冒泡排序算法的步骤如下:


(1) 第一轮,从第 1 个数到第 n 个数,逐个对比两个每相邻的 s[ j ]、s[ j + 1 ],如果 s[ j ] > s[ j + 1 ],则交换。这一

轮的结果是把最大的数 “冒泡” 到了第 n 个位置,在后面不用再管它。

(2)第二轮,从第 1 个数到第 n - 1 个数,对比每相邻的数。这一轮,把第 二大的数 “冒泡” 到了第 n - 1个位置。

(3)继续以上过程,直至结束。


2、快速排序

快速排序是一种基于分治法的优秀排序算法。

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
int n, m;
int s[1000001];
void quick_sort(int s[],int L,int R) {
  int left = L, right = R;
  int flag = s[left];
  if (L > R) return;
  while (left < right) {
    while (s[right] >= flag && left < right) right--;
    if (left < right) {
      int temp = s[right];
      s[right] = s[left];
      s[left] = temp;
    };
    while (s[left] <= flag && left < right) left ++;
    if (left < right) {
      int temp = s[right];
      s[right] = s[left];
      s[left] = temp;
    };
    if (left >= right) s[left] = flag;
  }
  quick_sort(s,L,right - 1);
  quick_sort(s,right + 1,R);
}
int main() {
  while (~scanf("%d %d", &n, &m)) {
    for (int i = 0; i < n; i++) scanf("%d", &s[i]);
    quick_sort(s,0,n-1);
    for (int i = n - 1; i >= n - m; i--) {
      printf("%d ", s[i]);
    }
  }
  return 0;
}

在quick_sort()运行后,得到从小到大的排序结果,然后从后往前打印前m大的数字。

快速排序算法的步骤如下:

(1)先选取一个基准数 flag,一般选择第一个元素作为基准数。

(2)将数组中小于基准数的数字放在基准数左边,数组种大于基准数的数字放在基准数右边。

(3)然后以基准数为中心,将原数组分为左右两部分,分别对这两部分重复以上两个过程,直到得到每个子集中只有一个元素为止。

————————————————

版权声明:本文为CSDN博主「京茶吉鹿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_52372879/article/details/122277461

相关文章
|
JSON 前端开发 Java
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
427 0
|
存储 资源调度 分布式计算
CDP中配置Apache Hadoop Yarn的安全性
CDP中配置Hadoop Yarn的安全性。
867 0
CDP中配置Apache Hadoop Yarn的安全性
|
11月前
|
数据采集 小程序 API
通义千问Qwen2.5-Coder 全系列来咯!强大、多样、实用
千问团队开源了强大的 Qwen2.5-Coder 系列模型,涵盖 0.5B 到 32B 六种尺寸,旨在推动开放代码模型的发展。该系列模型在代码生成、修复和推理等方面表现出色,支持多种编程语言,并在多个基准测试中达到 SOTA 水平。此外,Qwen2.5-Coder 还提供了丰富的应用场景,如代码助手、Artifacts 和 Interpreter,满足不同开发者的需求。
3844 106
|
机器学习/深度学习 人工智能 语音技术
情感识别与表达:FunAudioLLM的情感智能技术
【8月更文第28天】随着人工智能的发展,语音交互系统越来越普遍。其中,情感智能技术成为提高用户体验的关键因素之一。本文将探讨 FunAudioLLM 如何利用情感识别和表达技术来增强语音交互的真实感,并提供具体的代码示例。
1240 0
|
应用服务中间件 Android开发
Server Tomcat v9.0 Server at localhost failed to start问题的解决
Server Tomcat v9.0 Server at localhost failed to start问题的解决
1258 0
|
10月前
|
搜索推荐 Android开发 开发者
探索安卓系统的最新特性与发展趋势
本文深入分析了Android 13的新功能和改进,以及这些更新对用户体验和开发者社区的影响。文章还预测了未来Android系统的发展方向,为技术爱好者提供了宝贵的信息。
|
11月前
Cursor + qwen2.5-coder 32b 的配置方式
安装Cursor后,进入设置修改OpenAI基础URL为阿里云的DashScope接口,并添加Qwen2.5-Coder 32B模型。需先访问阿里云百灵控制台申请免费Key。配置完成后,即可使用该模型进行开发和测试。
8055 2
|
监控 数据挖掘 关系型数据库
结构化思维的理解与思考
结构化思维是一种将信息要素从无效转化为有序,提炼核心要点,将信息转化为有结构的知识,更好的帮助大脑理解和记忆,并支持我们清晰表达的通用能力。
1497 2
结构化思维的理解与思考
|
监控 安全 数据安全/隐私保护
SNMPv3:网络管理的安全进化
【4月更文挑战第22天】
510 4
|
图形学
【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇2(附项目源码)
【用unity实现100个游戏之18】从零开始制作一个类CSGO/CS2、CF第一人称FPS射击游戏——基础篇2(附项目源码)
332 0