一共三种方式 1 先查重在排序
2 先排序再查重
3 统计排序
111
先查重在排序
#include
int a[101010];
using namespace std;
int main () //小明的随机数 先查重再排列
{
int n;
cin>>n;
int m = 0;
for(int i = 0 ; i <n;i++)
{
int x;
cin>>x;//输入序列中的每一个数
int flag = 1;//标记是否重复出现
for(int j = 0;j<m;j++)//查重完的被存到该序列,m为序列长度
{
if(a[j] == x)//如果这个a【j】被存过,标记一下
{
flag = 0 ;//标记为0
break;
}
}
if(flag == 1) a[m++] = x;//没被存过存到m中,m++
}
三种排序方式
1)1 第一个位置开始扫描,找到后面最小的,交换
2 第二个位置开始扫描,找到第二个位置后面最小的,交换
以此类推到第n个就不用向后扫了。
for(int i = 0 ; i<m-1;i++)
{
int pos = i;
for(int j = i ;j<m;j++)
if(a[j]<a[pos])pos = j;//找到后面最小的那个数的位置
swap(a[pos],a[i]);//交换
} //交换完成
2)冒泡排序(大的一直往上面浮)
for(int i = 0 ;i<m-1;i++)
{
for(int j = 0 ;j<m-i-2;j++)(如果最大的浮上去了,那么最后的位置后背一次占领)
{
if(a[j]>a[j+1])swap(a[j],a[j+1]);(j+1包含了最后一个数)
}
}
3)插排
for(int i = 1 ; i<m;i++)
{
int pos,x = a[i];
for(pos = 0 ;pos<i;pos++)//
查找i前面的数有没有比它大的从第二个开始查,不用担心会漏,i前面的数一直都按大小有序排列,哪里刚好大一 点,直接平移插到这个数的地址上,这个数包括后面的数集体向后移动一位
{
if(a[pos] > x)break;//找到了
for(int j = i - 1;i>=pos;j--)
a[j+1]=a[j]
a[pos] =x ;
}
222222
先排序再查重
排序按上面三种格式
查重只需要判断从第二个数开始和前面的数是否不同,不同就输出。
3333333
统计排序
略
快排模板
略