當串列的長度為 3 時,我的代碼按升序對串列進行排序,代碼運行良好,但是當串列的長度增加且插入的變數數量增加時,輸出要么是“系統越界”,要么不沒有正確排序。
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]);
}
}
}
uj5u.com熱心網友回復:
“排序”部分似乎不正確,itemcount當只插入 1 個元素時,它會在回圈中多次遞增,而不是 1。
因此,應該在必須插入新專案的位置檢測索引,然后將元素移到lists陣列的末尾。
此外,當嘗試插入的元素多于 時,需要解決一種情況lists.length:列印訊息并忽略嘗試、拋出例外或增加lists(例如使用Arrays.copyOf)的大小
的線性搜索id如下,因為串列的大小比較小(如果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
uj5u.com熱心網友回復:
這就是插入排序,每次我們向已經排序的串列中插入一個專案。所有大于該專案的元素都向前移動。所以我們需要在正確的位置停止,所以它需要在迭代回圈中附加條件。看看它是如何作業的,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 ;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/314580.html
