30/09/2018, 16:14

Lỗi ArrayIndexOutOfBoundsException khi hiện thực Insertion Sort

Hàm sắp xếp của mình bị lỗi gì vậy mọi người? Phép so sánh compareTo mình kiểm tra đúng rồi khi chạy lại báo lỗi ở vòng while

Đây là code của mình:

public void insertionSort(StudentNotes[] data) {
    for (int i = 1; i < size; i++) {
        int j = i-1;
        StudentNotes temp = data[i];
        while (data[j].compareTo(temp) > 0 && j >= 0) {
            data[j + 1] = data[j];
            j--;
        }
        data[j + 1] = temp;
    }
}

Đây là thông báo lỗi:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at midExam.DatabaseDSA_Note.insertionSort(DatabaseDSA_Note.java:152)
at midExam.DatabaseDSA_Note.main(DatabaseDSA_Note.java:68)

Dòng 152 là ngay chỗ vòng while.

Nguyễn Minh Dũng viết 18:26 ngày 30/09/2018

Xem code C tương ứng ở đây, code C và Java cơ bản giống nhau tới 99%.

Ngồi rảnh rảnh nghiên cứu lại giải thuật đã bỏ từ lâu. Bắt đầu với Insert sort. Hình ảnh minh họa: [image] Coi video này để lấy ý tưởng về Insert sort Video 1: Video 2: Code lại bằng C #include <stdio.h> int main() { int length = 5; int array[] = {5,2,4,3,1}; for(int unsorted_id = 1; unsorted_id < length; unsorted_id++) { int element = array[unsorted_id]; int sorted_id = unsorted_id - 1; while(sorted_id >= 0 && element > array[sorted_id]) { …
Nu Kan Trần viết 18:28 ngày 30/09/2018

giống nhau mà anh. bài của em viết bằng C chạy đúng rồi nhưng viết lại trên java lại bị lỗi

Nguyễn Minh Dũng viết 18:28 ngày 30/09/2018

Lỗi như thế nào? Em ghi báo lỗi ra.

Nu Kan Trần viết 18:25 ngày 30/09/2018

thông báo lỗi

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at midExam.DatabaseDSA_Note.insertionSort(DatabaseDSA_Note.java:152)
at midExam.DatabaseDSA_Note.main(DatabaseDSA_Note.java:68)

152 là ngay chỗ vòng while đó anh

Nguyễn Minh Dũng viết 18:17 ngày 30/09/2018

ArrayIndexOutOfBoundsException

Lỗi này tức là trong lúc duyệt mảng, em đã duyệt vượt ra khỏi số lượng phần tử của mảng.

152 là ngay chỗ vòng while đó anh

Nếu vậy thì j đã lớn hơn kích thước mảng data ở một thời điểm nào đấy. Em kiểm tra lại.


P/S: Trong các bạn ở diễn đàn, có nhiều bạn hoạt động tích cực, các bạn sẽ sớm lên Level 3. Khi lên Level 3, các bạn hãy giúp Đạt sửa các câu hỏi lại sao cho phù hợp với nội dung topic.

Cảm ơn các bạn, có các bạn, chúng ta sẽ xây dựng được một cộng đồng học tập / thảo luận một cách thông minh hơn.

Nu Kan Trần viết 18:23 ngày 30/09/2018

Có phải khi j = 0
j–; thì j = -1
quay lại kiểm tra đk data[j].compareTo(temp) > 0 không thấy data[-1] đúng không anh đạt

Nguyễn Minh Dũng viết 18:21 ngày 30/09/2018

không thấy data[-1]

data[-1] không tồn tại nha em.

Nu Kan Trần viết 18:24 ngày 30/09/2018

Cảm ơn anh em làm được rồi phải kiểm tra j >= 0 trước khi kiểm tra data[j].compareTo(temp) > 0

Nguyễn Minh Dũng viết 18:21 ngày 30/09/2018

Tốt, nhưng em đừng đặt tên biến như vậy, bắt chước anh mà đặt tên biến kìa.

Bài liên quan
0