排序与查找可以说是计算机领域最经典的问题,排序和查找问题在考研机试真题中经常出现。排序考点在历年机试考点中分布广泛。排序既是考生必须掌握的基本算法,又是考生
学习其他大部分算法的前提和基础。首先学习对基本类型的排序。对基本类型排序,是指对诸如整数、浮点数等计算机编程语言内置的基本类型进行排序的过程。
例题1:
排序_牛客题霸_牛客网 对输入的n个数进行排序并输出。。题目来自【牛客题霸】http://t.cn/E9dLx5K
解析:
#include<iostream>
#include<algorithm>
using namespace std;int main()
{int n;int arr[100] = { 0 };cin >> n;for (int i = 0; i < n; i++){cin >> arr[i];}sort(arr, arr + n);for (int i = 0; i < n; i++){cout << arr[i] << " ";}cout << endl;return 0;
}
下面介绍一个非常重要的库函数sort:
先来看看怎么使用,头文件需要带上#include<algorithm>
注意,sort的前两个参数是左闭右开的
sort函数默认是升序排列
如果需要设计降序或者自定义排序,那么需要设计一下comp函数,返回值是bool类型
设计comp函数的原则:不发生交换的条件下返回真(true),否则返回false
关键是去寻找所有不发生交换的情况,左参数为lhs,右参数为rhs,参数的类型要取决于排序的数据类型而定。
下面通过几道例题来感受一下comp函数的设计:
整数奇偶排序_牛客题霸_牛客网输入10个整数,彼此以空格分隔。重新排序以后输出(也按空格分隔),要求: 1.先输出其中的。题目来自【牛客题霸】http://t.cn/E9glPvp思路:
分析什么情况下数据不发生交换:
代码解析:
#include<algorithm>
#include<iostream>
using namespace std;bool comp(int lhs, int rhs)
{if (lhs % 2 != 0 && rhs % 2 == 0){return true;}else if (lhs % 2 != 0 && rhs % 2 != 0 && lhs > rhs){return true;}else if (lhs % 2 == 0 && rhs % 2 == 0 && lhs < rhs){return true;}else{return false;}
}
int main()
{int arr[10] = { 0 };for (int i = 0; i < 10; i++){cin >> arr[i];}sort(arr, arr + 10, comp);for (int i = 0; i < 10; i++){cout << arr[i] << " ";}cout << endl;return 0;
}
成绩排序_牛客题霸_牛客网用一维数组存储学号和成绩,然后,按成绩排序输出。。题目来自【牛客题霸】http://t.cn/E9d3ysv
代码解析:
#include<iostream>
#include<algorithm>
using namespace std;struct Student
{int grade;//成绩int id;//学号
};
bool comp(Student lhs, Student rhs)
{if (lhs.grade < rhs.grade){return true;}else if (lhs.grade == rhs.grade && lhs.id < rhs.id){return true;}else{return false;}
}
int main()
{Student arr[100];//定义一个student类型的数组int n;cin >> n;for (int i = 0; i < n; i++){cin >> arr[i].id >> arr[i].grade;//先输入学号,再输入成绩}sort(arr, arr + n, comp);for (int i = 0; i < n; i++){cout << arr[i].id << " " << arr[i].grade;cout << endl;}return 0;
}
成绩排序_牛客题霸_牛客网查找和排序 题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,。题目来自【牛客题霸】http://t.cn/E9gyHM1
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;struct Student
{string name;//姓名int grade;//成绩int num;//录入顺序
};
bool comp1(Student lhs, Student rhs)
{//降序排列if (lhs.grade > rhs.grade){return true;}else if (lhs.grade == rhs.grade && lhs.num < rhs.num){return true;}else{return false;}
}
bool comp2(Student lhs, Student rhs)
{//升序排列if (lhs.grade < rhs.grade){return true;}else if (lhs.grade == rhs.grade && lhs.num < rhs.num){return true;}else{return false;}
}
int main()
{Student arr[10000];int n;while (cin >> n){int way;//判断输入的是0还是1cin >> way;for (int i = 0; i < n; i++){cin >> arr[i].name >> arr[i].grade;arr[i].num = i + 1;//表示为第几个录入的}if (way == 0){//表示成绩降序sort(arr, arr + n, comp1);}else{//表示成绩升序sort(arr, arr + n, comp2);}for (int i = 0; i < n; i++){cout << arr[i].name << " " << arr[i].grade;cout << endl;}}return 0;
}