我正在使用冒泡排序按从低到高的顺序对数组中的数字进行排序。但有一些数字是相同的,但我不需要它们打印两次。那么如何检查它是否已经打印而不是重复动作呢?
泡泡排序:
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(m[i]>m[j]){
temp=m[i];
m[i]=m[j];
m[j]=temp;
}
}
}
答案 0 :(得分:5)
由于数字在打印时已经排序,因此您可以存储最后打印的数字并在打印前与之进行比较。
类似的东西:
std::cout << m[0] << std::endl;
int last_print = m[0];
for(int i = 1; i < n; ++i)
{
if(m[i] != last_print)
{
std::cout << m[i] << std::endl;
last_print = m[i];
}
}
答案 1 :(得分:4)
在打印时过滤复制(假设m为int [])
int last = 0;
for(int i=0;i<n;i++){
int num = m[i];
if (i == 0 || last != num) {
// print num;
}
last = num;
}
或者这种方式,如果你不喜欢太多的变种
for(int i=0;i<n;i++){
if (i == 0 || m[i - 1] != [i]) {
// print m[i];
}
}
或者你可以删除sort
上的重复项for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;){
if (m[i]==m[j]) { // remove
m [j] = m [n - 1]; // replace with last
n --; // cut last
} else {
if(m[i]>m[j]){
temp=m[i];
m[i]=m[j];
m[j]=temp;
}
j ++;
}
}
}
答案 2 :(得分:2)
您可以在打印后立即将号码添加到std::set
,并在打印前检查所有号码是否在集中。
set
过度杀伤并且效率低于仅记录最后打印的数字,并且之后只打印与之不同的数字。