排序练习
来源:互联网 发布:sql查询分析器在破解 编辑:程序博客网 时间:2024/06/08 18:33
题目描述:
给你n个整数,请按从大到小的顺序输出其中前m大的数。
输入:
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
输出:
对每组测试数据按从大到小的顺序输出前m大的数。
样例输入:
5 33 -35 92 213 -644
样例输出:
213 92 3
解法1
#include <iostream>#include<stdio.h>#include<string.h>#include<algorithm>#define N 1000000using namespace std;int a[N];int main(){ int n, m, i, flag = 0; while (scanf_s("%d%d", &n, &m) != EOF) { for (i = 0;i<n;i++) scanf_s("%d", &a[i]); sort(a, a + n); flag = n - 1; printf("%d", a[flag]); flag -= 1; for (i = m;i>1;i--) { printf(" %d", a[flag]); flag--; } cout << endl; } return 0;}
解法2
#include <stdio.h>#define OFFSET 500000 //偏移量,用于补偿实际数字与数组下标之间偏移int Hash[1000001]; //偏移量,用于补偿实际数字与数组下标之间偏移int main() { int n, m; while (scanf("%d%d", &n, &m) != EOF) { for (int i = -500000;i <= 500000;i++) { Hash[i + OFFSET] = 0; }//初始化,将每个数字都标记为未出现 for (int i = 1;i <= n;i++) { int x; scanf("%d", &x); Hash[x + OFFSET] = 1; //凡是出现过的数字,该数组元素均被设置成1 } for (int i = 500000;i >= -500000;i--) { //输出前m个数 if (Hash[i + OFFSET] == 1) { //若该数字在输入中出现 printf("%d", i); //输出该数字 m--; //输出一个数字后,m减一,直至m变为0 if (m != 0) printf(" "); //注意格式,若m个数未被输出完毕,在输出的 数字后紧跟一个空格 else { printf("\n"); //若m个数字已经被输出完毕,则在输出的数字后面紧跟 一个换行, 并跳出遍历循环 break; } } } } return 0;}
解法3
#include<stdio.h>#define N 1000000int array[N];void quick_sort(int s[], int l, int r){ int i, j, x; if (l < r) { i = l; j = r; x = s[i]; while (i < j) { while (i < j && s[j] > x) j--; /* 从右向左找第一个小于x的数 */ if (i < j) s[i++] = s[j]; while (i < j && s[i] < x) i++; /* 从左向右找第一个大于x的数 */ if (i < j) s[j--] = s[i]; } s[i] = x; quick_sort(s, l, i - 1); /* 递归调用 */ quick_sort(s, i + 1, r); }}int main() { int n, m; while (scanf_s("%d%d", &n, &m) != EOF) { for (int i = 0;i < n;i++) { scanf_s("%d", &array[i]); } quick_sort(array, 0, n - 1); int temp = m; for (int j = n - 1;j >= n-temp;j--) { printf_s("%d", array[j]); m--; if (m != 0) printf(" "); else { printf("\n"); break; } } } return 0;}
总结:解法三是我自己写的,一次快速排序+反向的for循环。
输出格式不正确。
解决办法:每次输出数字后m-1,m等于0的时候跳出循环即可。
阅读全文
0 0
- 练习排序
- 排序练习
- 排序练习(归并排序)
- c++ 选择排序 练习
- 数据结构练习:排序
- 数据结构练习:排序
- 数据结构练习:快速排序
- [算法练习] 冒泡排序
- jquery排序 练习
- 直接插入排序 练习
- 折半插入排序 练习
- 简单选择排序练习
- 冒泡排序练习
- 内部排序算法练习
- 编程练习:归并排序
- 编程练习:堆排序
- 编程练习:快速排序
- erlang基础练习-排序
- android AsyncChannel机制 --- 双通道连接
- Python简单的名片管理器
- Python字典以及常见的操作
- Python元组
- 数组-leetcode 283. Move Zeroes
- 排序练习
- 绝对值排序
- css画半圆进度条
- Sublime MinGw实现C/C++代码编译运行
- hdu 5143 NPY and arithmetic progression(枚举)
- MongoDB基本介绍及一些用法
- UVA 1585 Score
- 118A
- 简单数据结构(队列 栈 树 堆 )