30/09/2018, 17:34

Giúp đỡ về QuickSort trong Java

Mình có tham khảo một clip và bài trên mạng về QuickSort giờ thực hành thì nó chả chạy được ngồi một lúc cũng không biết lỗi nên mong ae gíup mình.

    public class QuickSort {
    public static int arrayInt [] ={2,23,12,20,10,15,20};
    public void output(){
        for(int i: arrayInt){
            System.out.print(i+" ");
        }
    }
    public void Quicksort(int left,int right){
        int x = arrayInt[(left+right)/2];//Gán mốc là giá trị ở giữa mãng
        int i = left, j = right;//Gán giá trị i chạy từ trái qua phải và j ngược lại
        do{
            while((i<=j)&&(x>=arrayInt[i])){
              i++;  
            }
            while((i<=j)&&(x<=arrayInt[j])){
                j--;
            }
            if(i<j){
                int temp = arrayInt[i];
                arrayInt[i] = arrayInt[j];
                arrayInt[j] = temp;
                i++;
                j--;
            }
        }while(i<=j);
        if(left<j){
            Quicksort(left, j);
        }
        if(i<right){
            Quicksort(i, right);
        }
    }
    public static void main(String[] agrs){
        QuickSort met = new QuickSort();
        System.out.println("Value before the sort");
        met.output();
        met.Quicksort(0, arrayInt.length -1);
        System.out.println("Value after the sort");
        met.output();
    }
}

Nó được như sau:

Value before the sort
2 23 12 20 10 15 20
Gió viết 19:44 ngày 30/09/2018
            while((i&lt;=j)&&(x&gt;=arrayInt[i])){
              i++;  
            }
            while((i&lt;=j)&&(x&lt;=arrayInt[j])){
                j--;
            }

Cái này nếu a[i] hoặc a[j] ==x thì không biết sắp về bên nào? mình nghĩ dk là:

while((i<=j)&&(x>arrayInt[i])){
              i++;  
            }
            while((i<=j)&&(x<arrayInt[j])){
                j--;
            }

if(i<j){
int temp = arrayInt[i];
arrayInt[i] = arrayInt[j];
arrayInt[j] = temp;
i++;
j–;
}

nếu i==j thì i++,j-- nữa nên dk đây là if(i<=j)

Người bị bơ viết 19:50 ngày 30/09/2018

Ý bạn điều kiện khúc này hả:

if(i<j){
                int temp = arrayInt[i];
                arrayInt[i] = arrayInt[j];
                arrayInt[j] = temp;
                i++;
                j--;
            }

Nếu mình đổi điều kiện i<=j thì khi i==j nó sẽ tự đổi chổ chính nó. Cho nên củng như không .

Gió viết 19:38 ngày 30/09/2018

À ý nói là nếu i==j thì i++,j-- nên phải viết thêm vào 1 if nữa. nên nếu không muốn viết thêm thì thêm vào dấu = đó

Người bị bơ viết 19:35 ngày 30/09/2018

Mơ hồ qúa bạn , sữa code lại vứt mình tham khỏa với! Với lai sao vắng thế nhỉ? Hix

Gió viết 19:47 ngày 30/09/2018
/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;
class QuickSort{
  public static int arrayInt [] ={2,23,12,20,10,15,20};
    public void output(){
        for(int i: arrayInt){
            System.out.print(i+" ");
        }
        System.out.println();
    }
    public void Quicksort(int left,int right){
    
        int x = arrayInt[(left+right)/2];//Gán mốc là giá trị ở giữa mãng
        int i = left, j = right;//Gán giá trị i chạy từ trái qua phải và j ngược lại
        do{
            while((i<=j)&&(x>arrayInt[i])){
              i++;  
            }
            while((i<=j)&&(x<arrayInt[j])){
                j--;
            }
            if(i<=j){
                int temp = arrayInt[i];
                arrayInt[i] = arrayInt[j];
                arrayInt[j] = temp;
                i++;
                j--;
            }
        }while(i<j);
        //System.out.printf("%d %d %d %d\n",left,j,i,right);
        //output();
        if(left<j){
            Quicksort(left, j);
        }
        if(i<right){
            Quicksort(i, right);
        }
    }
    public static void main(String[] agrs){
        QuickSort met = new QuickSort();
        System.out.println("Value before the sort");
        met.output();
        met.Quicksort(0, arrayInt.length -1);
        System.out.println("Value after the sort");
        met.output();
    }
}
Người bị bơ viết 19:44 ngày 30/09/2018

Nếu như đổi điều kiện i<=j thì nó sẽ đổi chổ chính nó đó bạn, thực sự thêm vào = là thừa.

Gió viết 19:35 ngày 30/09/2018

thì thực ra là thêm 1 câu if nữa:

if (i==j) i++,j--;

Nhưng viết gộp vào cho nó đơn giản thôi. 2 câu trên khác nhau bởi i==j của bạn không thay đổi i,j

Người bị bơ viết 19:48 ngày 30/09/2018

Nếu như i==j của mình thì nó sẽ thây đổi ở phiên sau bạn ạ! Ví dụ: array[i]=array[j]=5 so sánh nó với mốc x=10 thì nó không thể vừa lớn hơn vừa nhỏ hơn được nên sẽ có i++ hoặc j-- ở đây.

while((i<=j)&&(x>arrayInt[i])){
              i++;  
            }
while((i<=j)&&(x<arrayInt[j])){
                j--;
            }
Gió viết 19:41 ngày 30/09/2018

Nếu i==j ở bước đó thì nó đã thoát ra câu lệnh do .. while mất rồi. nên Qsort sẽ bị lặp vô hạn do có 1 phần tử chung

Người bị bơ viết 19:39 ngày 30/09/2018

Tại sao lại thoát câu lệnh do…while nhỉ? nó sẽ lặp 1 lần nữa rồi mới thoát chứ?

Gió viết 19:36 ngày 30/09/2018

Không biết nên nói về code nào nữa. Nếu mà code của bạn mình cũng không biết nên thay đổi kiểu gì

Người bị bơ viết 19:43 ngày 30/09/2018

Cảm ơn bạn ha , thôi chắc gác lại học tiếp rồi hồi xem lại.

Người bị bơ viết 19:35 ngày 30/09/2018

Mình sữa lại chỗ này: while(i>=j) thành while(i<=j).

do{
            while((i<=j)&&(x>=arrayInt[i])){
              i++;  
            }
            while((i<=j)&&(x<=arrayInt[j])){
                j--;
            }
            if(i<j){
                int temp = arrayInt[i];
                arrayInt[i] = arrayInt[j];
                arrayInt[j] = temp;
                i++;
                j--;
            }
        }while(i<=j);
Bài liên quan
0