-
//升序:sort(a,a+20,less<data-type>());
-
//降序:sort(a,a+20,greater<data-type>())
1. sort函数有三个参数:
(1)第一个是要排序的数组的起始地址。
(2)第二个是结束的地址(最后一位要排序的地址)
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,还可以不写第三个参数,此时默认的排序方法是从小到大排序。
sort(a,a+10);
代码例子: 从小到大排序
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
sort(a,a+10);
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
return 0;
}
代码例子: 从大到小排序 需要加入一个比较函数 complare(),此函数的实现过程是这样的
bool complare(int a,int b)
{
return a>b;
}
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
sort(a,a+10,complare);//在这里就不需要对complare函数传入参数了,//这是规则
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
return 0;
}
代码例子: 使用标准的第三个参数, c++标准库强大的功能完全可以解决这种麻烦。
less<数据类型>()//从小到大排序
greater<数据类型>()//从大到小排序
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
sort(a,a+10,less<int>());
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
return 0;
}
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[10]={9,6,3,8,5,2,7,4,1,0};
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
sort(a,a+10,greater<int>());
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
return 0;
}
代码例子: 利用sort函数还可以实现对字符的排序,排序方法大同小异,
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
char a[11]="asdfghjklk";
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
sort(a,a+10,greater<char>());
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
return 0;
}
2. unique()
unique()是C++标准库函数里面的函数,其功能是去除相邻的重复元素(只保留一个),所以使用前需要对数组进行排序
上面的一个使用中已经给出该函数的一个使用方法,对于长度为n数组a,unique(a,a+n) - a返回的是去重后的数组长度
那它是怎么实现去重的呢?不是删除,它并没有将重复的元素删除,而是把重复的元素放到数组的最后面藏起来了。 当把原长度的数组整个输出来就会发现:
while (cin>>n)
{
for (int i = 0;i < n;++i)
{
scanf("%d",&a[i]);
}
sort(a,a+n); //先排序
int k = unique(a,a+n) - a; //然后再去重
for (int i = 0;i < n;++i)
{
printf("%d ",a[i]);
}
puts("");
}
输出
其中 1 2 8 9 10就是去重后的数组,我这里把后面“藏起来”的数也输出了,方便理解
这个函数还可以这样用
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 1000;
int a[N + 5];
int main()
{
int n;
while (cin >> n)
{
for (int i = 0;i < n;++i) scanf("%d",&a[i]);
sort (a, a + n);
vector<int>v (a, a + n);
vector<int>::iterator it = unique (v.begin(), v.end() );
v.erase (it, v.end() );//这里就是把后面藏起来的重复元素删除了
for ( it = v.begin() ; it != v.end() ; it++ )
{
printf ("%d ", *it);
}
puts("");
}
return 0;
}
输出
这个就是利用vector把后面藏着的元素删除了