当前位置: 首页 > 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.jsqmd.com/news/116033/

相关文章:

  • dy直播间评论保存插件
  • Section five Homework
  • 神经网络动力学框架NeRD在机器人仿真领域的革新
  • Day35less--导入与导出
  • 别再花冤枉钱!这2个免费降AI率的工具,降AI效果也很好!
  • 10个高效降AI率工具,本科生必看!
  • Section four Homework
  • 动态规划算法
  • 美团 商家端响应体解密
  • 阅读诗歌:时间的沙漏
  • 杜教筛
  • Rope旋转位置编码解读
  • PCL分割——圆柱分割
  • 人= 具身生命 × 关系网络 × 叙事自我 × 价值选择
  • Item46--需要类型转换时请为模板定义非成员函数
  • 别再踩坑了!6款实测有效的降ai工具推荐,保姆级教你降低ai率!
  • 读不懂诗歌:钟摆的胎动里倒游的鱼群正在翻译冰层
  • [项目]基于正倒排索引的Boost搜索引擎---编写搜索引擎模块 Searcher - 指南
  • 江西南昌住家保姆/不住家保姆品牌TOP5评测!专业认证+服务保障企业榜单发布,品质家政赋能现代家庭生活 - 全局中转站
  • Item45--运用成员函数模板接受所有兼容类型
  • 大数据领域Kafka与Hadoop的协同工作模式
  • 霍华德·马克斯的市场周期定位技巧
  • 别乱花钱了!6款实测有效的降ai工具推荐,学姐教你降低ai率!
  • 强烈推荐 wxWidgets
  • SFTDataset:Verl 单轮Dataset vs rllm 多轮Dataset vs Parallel-R1 Dataset
  • Boost asio定时器
  • 2025年度江西南昌育儿嫂企业TOP5评测!金牌一站式早教型育儿嫂品牌榜单发布,赋能现代家庭育儿新生态 - 全局中转站
  • 2025年度江西南昌老人护理企业TOP7评测!专业照护+经验沉淀优质品牌榜单发布,用心守护构筑长者幸福晚年 - 全局中转站
  • Product Hunt 每日热榜 | 2025-12-20
  • 过半的家庭都踩过近视的“坑”,每位爸妈都值得注意!