[英]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.