簡體   English   中英

按升序對列表進行排序,出現系統越界錯誤

[英]sorting lists in ascending order, with a System out of bound error

當列表的長度為 3 時,我的代碼按升序對列表進行排序,代碼運行良好,但是,當列表的長度增加且插入的變量數量增加時,輸出要么System out of bound要么不正確排序。

    public class Lists {
        
    int [] lists;
    int itemcount;
    
    public Lists(int l) {
        lists =new int[l];
        itemcount=0;
    }
    public void insert(int x) {
        if(itemcount==0) {
            lists[itemcount]=x;
            itemcount++;
        }
        else {
            for(int i=itemcount-1;i>=0;i--) {
                if(lists[i]>x) {
                    lists[i+1]=lists[i];
                    lists[i]=x;
                    itemcount++;
                }
                else {
                    lists[i+1]=x;
                    itemcount++;
                    
                }
            }
        }
    }
    public static void main(String[]args) {
        Lists s=new Lists(5);
        s.insert(9);
        s.insert(4);
        s.insert(6);
        s.insert(5);
        s.insert(8);
    
        
        for (int i=0;i<s.lists.length;i++) {
            System.out.print(s.lists[i]);
        }
        
        
    }
    
    }

“排序”部分似乎不正確,當僅插入 1 個元素時, itemcount在循環中多次遞增,而不是 1。

因此,應該在必須插入新項目的位置檢測索引,然后將元素移到lists數組的末尾。

此外,當嘗試插入比lists.length多的元素時,需要解決一種情況:打印一條消息並忽略該嘗試、拋出異常或增加lists的大小(例如使用Arrays.copyOf

id線性搜索如下,list的大小比較小(如果lists足夠大,應該使用二分搜索

public void insert(int x) {
    if (itemcount == lists.length) {
        lists = Arrays.copyOf(lists, lists.length * 2);
    }
    int id = 0;
    for (; id < itemcount; id++) {
        if (x <= lists[id]) {
            break; // insert in id
        }
    }
    for (int i = itemcount; i > id; i--) {
        lists[i] = lists[i - 1];
    }
    lists[id] = x;
    itemcount++;
}

此外,在打印lists內容時,最好使用itemcount作為限制,除非需要將 0 顯示為空元素。

因此,以下測試設置的輸出:

Lists s = new Lists(5);
s.insert(9); s.insert(4); s.insert(6);
s.insert(5); s.insert(8); s.insert(5);
s.insert(2);

for (int i=0;i<s.itemcount;i++) {
    System.out.print(s.lists[i] + " ");
}

輸出:

2 4 5 5 6 8 9 

這就是插入排序,每次我們向已經排序的列表中插入一個項目。 所有大於該項目的元素都向前移動。 所以我們需要在正確的位置停止,所以它需要在迭代循環中附加條件。 看看它是如何工作的, https://en.wikipedia.org/wiki/File:Insertion-sort-example-300px.gif

public void insert(int x) {
  int i;/*Insertion position */
  for(i=itemcount-1;i>=0 && lists[i]>x;i--) {
    lists[i+1]=lists[i];
  }
  lists[i+1]=x;
  itemcount++;    
 }

暫無
暫無

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

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