对于一个数组,通过对数组中的元素进行交换,我们可以将数组中的元素按从大到小或从小到大的顺序排列。
当我们希望对数组中的元素进行排序时,C++为我们提供了sort,有了sort这种工具,我们将不会再纠结排序的过程。
在我们需要用sort时,需要先引入一个算法的库-----<algorithm>,sort可以对任何类型的元素进行排序,包括我们自己定义的结构体。
用sort时在C++文件开始位置加入:
#include <algorithm>
下面这段代码展示的就是sort的一般用法,默认是从小到大进行排序:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int arr[] = { 2,4,5,1,3 };
sort(arr, arr + 5);
for (int i = 0; i < 5; i++)
{
cout << arr[i]<<" ";
}
return 0;
}
输出:
1 2 3 4 5
如果希望arr中的元素按照从大到小排序(或按照某一规则进行排列),我们则可以再为sort传入第三个参数-----“排序方法”:
sort(arr,arr+5,greater<int>());
其中,greater表示“更大”的意思,<int>表示待排序数组的数据类型为整型,代码就会变为:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int arr[] = { 2,4,5,1,3 };
sort(arr, arr + 5,greater<int>());
for (int i = 0; i < 5; i++)
{
cout << arr[i]<<" ";
}
return 0;
}
输出:
5 4 3 2 1
例1:前N名的平均数
输入一共分三行,第一行输入班级人数,第二行输入所有成绩,第三行输入想要计算的N。输出平均成绩。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int N,k,avg;
int sum = 0;
int arr[35];
scanf_s("%d", &N);
for (int i = 0; i < N; i++)
{
scanf_s("%d", &arr[i]);
}
sort(arr, arr + N, greater<int>());
scanf_s("%d", &k);
for (int i = 0; i < k; i++)
{
sum = sum + arr[i];
}
printf("%.2f", 1.0 * sum / k);
return 0;
}
结果:
10
93 85 77 68 59 100 43 94 75 82
4
93.00
例2:分数段统计
现如今要求将N名同学的考试成绩放在A数组中,各分段的人数存到B数组中,成绩为100的人数存到B[1]中,成绩为90到99的存到B[2]数组中,以此类推,输出所有成绩及每个分段的人数。
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int N,B[7];
int sum = 0;
int arr[35];
scanf_s("%d", &N);
for (int i = 0; i < N; i++)
{
scanf_s("%d", &arr[i]);
}
sort(arr, arr + N, greater<int>());
for (int i = 0; i < N; i++)
{
printf("%d ", arr[i]);
}
for (int i = 0; i < N; i++)
{
if (arr[i] == 100)
{
B[1]++;
}
else if (arr[i] >= 90)
{
B[2]++;
}
else if (arr[i] >= 80)
{
B[3]++;
}
else if (arr[i] >= 70)
{
B[4]++;
}
else if (arr[i] >= 60)
{
B[5]++;
}
else
{
B[6]++;
}
}
for (int i = 1; i <= 6; i++)
{
printf("%d", B[i]);
}
return 0;
}
输入:
10
93 85 77 68 59 100 43 94 75 82
输出:
1 2 2 2 1 2
例3.有趣的整数排序
如果我们想要按照除3余数小的优先规则进行排序,则又会用到bool函数来判断排序条件:
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int x,int y)
{
if (x % 3 != y % 3)
{
return x % 3 < y % 3 ;
}
else
{
return x < y ;
}
}
int main()
{
int num[105];
int N;
scanf_s("%d", &N);
for (int i = 0; i < N; i++)
{
scanf_s("%d", &num[i]);
}
sort(num, num + N, cmp);
for (int i = 0; i < N; i++)
{
if (i != N - 1)
{
printf("%d ", num[i]);
}
else
{
printf("%d\n", num[i]);
}
}
return 0;
}
输入:
10
1 2 3 5 8 9 11 23 27 49
输出:
3 9 27 1 49 2 5 8 11 23