当前位置: 首页 > news >正文

笨人小白的温故知新——排序(2)

这是一个一题多解的博客!下面是一道很简单的题:

1177:奇数单增序列

题目描述】

给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按升序输出。

【输入】

第1行为 N;

第2行为 N 个正整数,其间用空格间隔。

【输出】

增序输出的奇数序列,数据之间以逗号间隔。数据保证至少有一个奇数。

【输入样例】

10 1 3 2 6 5 4 9 8 7 10

【输出样例】

1,3,5,7,9

方法一:插入法

void insertSort(int a[], int n) { for(int i = 1 ; i < n ; i ++){ if(a[i] < a[i-1]){ int j = i-1 ; int x = a[i] ; while(j >= 0 && a[j] > x){ a[j+1] = a[j] ; j -- ; } a[j+1] = x ; } } }

这就是插入法的代码模板。它的原理很简单,就是以一个乱序的数组中的第一个数为基石,通过后面的数与前面的数字比较,将数字逐一为它们找到自己的位置。

下面是插入法写出来的AC代码:

#include <iostream> #include <stdio.h> using namespace std ; void insertSort(int a[], int n) { for(int i = 1 ; i < n ; i ++){ if(a[i] < a[i-1]){ int j = i-1 ; int x = a[i] ; while(j >= 0 && a[j] > x){ a[j+1] = a[j] ; j -- ; } a[j+1] = x ; } } } int main(){ int n , a[505] , k = 0 ; cin >> n ; for(int i = 0 ; i < n ; i ++) scanf("%d" , &a[i]) ; insertSort(a , n) ; int first = 1 ; for(int i = 0 ; i < n ; i ++){ if(a[i] % 2 == 1){ if(first == 1){ first = 0 ; printf("%d", a[i]) ; continue ; } else if(first == 0) printf(",%d" , a[i]) ; } } return 0 ; }

方法二:归并排序

#include <iostream> #include <algorithm> using namespace std ; const int N = 1e6+10 ; int tmp[N] ; void mergesort(int q[] , int l , int r){ if(l >= r) return ; int mid = l + r >> 1 ; mergesort(q , l , mid) ; mergesort(q , mid+1 , r) ; int i = l , j = mid+1 , k = 0 ; while(i <= mid && j <= r){ if(q[i] <= q[j]) tmp[k++] = q[i++] ; else tmp[k++] = q[j++] ; } while(i <= mid) tmp[k++] = q[i ++] ; while(j <= r) tmp[k++] = q[j ++] ; for(i = l , j = 0 ; i <= r ; i ++ , j ++) q[i] = tmp [j] ; } int main(){ int n , len , k = 0 ; cin >> n ; len = n ; int* a = new int[n] ; while(n --) scanf("%d" , &a[k++]) ; mergesort(a , 0 , len-1) ; int first = 1 ; for(int i = 0 ; i < len ; i ++){ if(a[i] % 2 == 1){ if(first == 1){ first = 0 ; printf("%d", a[i]) ; continue ; } else printf(",%d" , a[i]) ; } } return 0 ; }

这里,我用了动态数组来优化!

方法三:快速排序

do-while循环执行后:

  1. 左指针i:最终停在第一个不小于基准值x的元素上(即q[i] ≥ x,之前跳过的所有元素都是q[?] < x);
  2. 右指针j:最终停在第一个不大于基准值x的元素上(即q[j] ≤ x,之前跳过的所有元素都是q[?] > x);

简单说:i指向了左区间里「不该出现的大元素」,j指向了右区间里「不该出现的小元素」。

以上是我的困惑点,这是豆包为我作的解答。以下是我的AC代码:

#include <iostream> #include <algorithm> using namespace std ; const int N = 505 ; void quick_sort(int q[] , int l , int r){ if(l >= r) return ; int i = l-1 , j = r+1 , x = q[l+r>>1] ; while(i < j){ do i ++ ; while(q[i] < x) ; do j -- ; while(q[j] > x) ; if(i < j) swap(q[i] , q[j]) ; } quick_sort(q , l , j) , quick_sort(q , j+1 , r) ; } int main(){ int n , len , k = 0 , a[N]; cin >> n ; len = n ; while(n --) scanf("%d" , &a[k++]) ; quick_sort(a , 0 , len-1) ; int first = 1 ; for(int i = 0 ; i < len ; i ++){ if(a[i] % 2 == 1){ if(first == 1){ first = 0 ; printf("%d", a[i]) ; continue ; } else printf(",%d" , a[i]) ; } } return 0 ; }

明天我将用其他几种方法来做一下这道题!

http://www.cnnetsun.cn/news/167857.html

相关文章:

  • 免费降AI率的工具红黑榜:认准这2个免费降AI率工具,亲测有效!
  • 霍华德·马克斯的市场周期定位技巧
  • 1500字免费降AIGC率的额度,2026年毕业论文查重必备!
  • 1500字免费降AIGC率的额度,2026年毕业论文查重必备!(附每天5次aigc查重)
  • 别再焦虑了!6款实测有效的降ai工具推荐,学姐手把手教你降低ai率!
  • 国外软件,安装即时专业版!
  • 防控近视你需要知道的这些科普常识!
  • 抽奖机随机号码生成:3 种算法实现 + 测试全解析(附完整代码)
  • LLM入门指南:预训练、SFT和强化学习三步构建ChatGPT式大模型
  • LangChain v1.0 Runtime深度解析:构建可测试、可复用的大模型智能体
  • 信息与关系:涌现的三大核心原则
  • c++狼人杀
  • 50天50个小项目 (React19 + Tailwindcss V4) ✨ | DrawingApp(画板组件)
  • 使用自定义注解校验请求参数
  • 敢不敢用一年时间读完这12本书,模型入门必看的12本书!建议收藏!!
  • 对比:Qwen-VL与传统的CNN在图像处理应用
  • 【硬件设计】DC12V输入的防护+滤波设计
  • 快!太快了!一键生成!一键导出!微信自动统计数据报表来了!
  • 智能决策系统日志系统设计:AI架构师的调试与分析技巧
  • 力扣 11.盛最多水的容器 简单的双指针算法 题解
  • 深度学习驱动的论文降重工具有效规避查重风险,智能改写段落
  • 温度传感器PT1000与NTC10K介绍
  • 震惊!这家酶制剂供应商竟让行业炸锅
  • 数学建模与排版无忧?这10个AI论文工具精准解决复现难题
  • AI对打工人的三个影响
  • 小程序/APP接入分账系统:4大核心注意事项,避开合规与技术坑
  • 靠谱的厦门考研公司哪个好
  • 二叉搜索树的最近公共祖先:别再蛮力了,用规则思维找“血缘关系”
  • 推荐6个AI论文网站,提供降重与自然改写功能避免标红
  • 智能学术支持:6个AI论文平台解析,自动润色让内容更专业