Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 4 của 4
  1. #1

    StackOverflow khi gọi đệ quy trong quick Sort

    chắc mọi người đã quá quen thuộc với QuickSort. Nhưng cho mình hỏi QuickSort của mình sau đây lại bị lỗi StackOverFlow ạ? Cảm ơn vì đã đọc[IMG]images/smilies/biggrin.png[/IMG]


    Mã:
    import java.util.Scanner;
    
    /**
     * mr.Kurro
     * 14020665
     * bai tap 5
     */
    public class quickSort{
        public static void main(String[] args){
            Scanner in = new Scanner(System.in);
            System.out.println("so phan tu can sap xep: ");
            int N = in.nextInt();
            int[] A = new int[N];
            for(int i = 0; i < N; i++){
                System.out.print("Nhap phan tu can sap xep: ");
                A[i] = in.nextInt();
            }
            sort(A, 0, N - 1);
            for(int i = 0; i < N; i++){
                System.out.println(A[i]);
            }
        }
    
        static int partition(int[] a, int left, int right) {
            int i = left;
            int j = right;
            int pivot = a[(left + right) / 2];
            while (i <= j) {
                while (a[i] < pivot)
                    i++;
                while (a[j] > pivot)
                    j--;
                if (j <= j) {
                    // hoan doi vi tri hai so
                    a[i] += a[j];
                    a[j] = a[i] - a[j];
                    a[i] = a[i] - a[j];
                    i++;
                    j--;
                }
            }
            return i;
        }
        static void sort(int[] a, int left, int right){
            int p = partition(a, left, right);
            if(left < p){
                sort(a, left, p);
            }
            if(right > p){
                sort(a, p, right );
            }
        }
    }

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Có 1 lỗi typo:

    Mã:
    if (j <= j) {
    Còn thuật toán thì chưa biết được.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Thuật toán sai nhé. Nếu muốn kiểm tra xem có mảng phần tử chưa sắp xếp bên trái hay không thì phải so sánh left với j chứ không phải với i. Điều kiện left < i là luôn đúng nên hàm sort được gọi nhiều lần, dẫn đến tình trạng tràn stack.
    Mình thì sửa bài của bạn như thế này.
    Mã:
    	static void sort(int[] a, int left, int right) {
    		int temp;
    		int i = left;
    		int j = right;
    		int pivot = a[(left + right) / 2];
    		while (i <= j) {
    			while (a[i] < pivot)
    				i++;
    			while (a[j] > pivot)
    				j--;
    			if (j <= j) {
    				temp = a[i];
    				a[i] = a[j];
    				a[j] = temp;
    				i++;
    				j--;
    			}
    		}
    		if(left<j)
    			sort(a, left, j);
    		if(i<right)
    			sort(a, i, right);
    	}

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Mình dùng đệ quy bên C# cũng gặp StackOverFlow. Chia sẻ với bạn thế này hy vọng đúng :

    Với những phép đệ quy nhỏ thì nguy cơ gây tràn stack là ít nhưng với những phép đệ quy lớn thì rất dễ gây ra tràn stack.

    Đệ quy người ta không ưu tiên dùng (đây là mình đọc đâu đó ). Khi gọi đệ quy thì giống như việc bạn gọi rất nhiều hàm nhưng hàm đó không kết thúc. Khi gọi hàm thì nó sẽ lưu các thông tin cần thiết trước khi gọi hàm vào stack, khi hàm thực hiện xong nó sẽ lấy các thông tin trước khi gọi hàm trên stack để khôi phục công việc. Sau đó các thông tin đã lưu trên stack sẽ bị xóa đi. Nếu các hàm được gọi rất nhiều nhưng không kết thúc thì sẽ tràn stack.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •