簡體   English   中英

C ++冒泡排序,如何忽略相同的數字

[英]C++ Bubble Sort, how to ignore the same numbers

我正在使用冒泡排序按從低到高的順序對數組中的數字進行排序。 但是有些數字是相同的,但是我不需要將它們打印兩次。 那么,如何檢查它是否已經打印並且不重復操作?

冒泡排序:

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;
            }
        }
    }

由於在打印時已經對編號進行了排序,因此您可以存儲上次打印的編號,並在打印之前與該編號進行比較。

就像是:

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];
  }
}

打印時過濾掉重復項(假設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];
    }
 }

或者,您可以刪除重復項

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 ++;
        }
    }
}

您可以在打印后立即將其添加到std::set中,並在打印之前檢查所有數字是否在集合中。

編輯:我錯過了數字排序的限制。 在那種情況下,一個set比僅僅跟蹤最后打印的數字以及僅打印與之不同的數字要大得多,效率也較低。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM