有序數組去重的幾種算法


最差的算法:算法

最差的算法:
去重,與數組是否有序無關
public void noDups(){
    //從0開始遍歷
    for(int i=0; i<nElems-1; i++){
        //與後面每個比較
        for(j=i+1; j<nElems; j++){
            //若是相等,後面的全部的項向前移動,總數-1
            if(a[i]==a[j]){
                for(k=j+1; k<nElems; k++){
                    a[j] = a[j+1];
                    nElems--;
                }
            } 
        }
    }
}

把後面不一樣的往前
public void noDups(){
    //數組從小到大排列
    this.insertionSort();
    int i=0;    //第一個指針
    int j=0;    //第二個指針
    for(j=1; j<nElems;j++){
        //遇到相同的跳過,不一樣的則加到前面
        if(a[j]!=a[i]){
            a[++i]=a[j]
        }
    }
    nElems = i+1;
}

把重複的標記爲-1,假設沒有負數
public void noDups(){
    //數組從大到小排列
    this.insertionSort();
    final int FLAG = -1;    //重複數字標記
    int holdNumber; //被標記的數字個數
    //尋找重複項並標記
    for(int i=0; i<nElems; i++){
        for(int j=i+1; j<nElems; j++){
            if(a[i]==a[j]){
                a[j] = FLAG;
                holdNumber++;
            }
        }       
    }

    //處理被標記的數字
    //思路和第一個同樣
    int i=0; //索引位
    for(int j=1; j<nElems; j++){    //第一個不多是重複數
        //找到第一個標記位
        if(a[j]==FLAG && i==0){
            i = j;
        }else if(a[j]!=FLAG && i!=0){   //邏輯同第二個算法
            a[i] = a[j];
            i++;
        }
    }
    nElems -= holdNumber;

}
相關文章
相關標籤/搜索