Nhờ nhận xét và góp ý để rút gọn code sắp xếp danh sách

package tutanloc;

import java.util.ArrayList;
import java.util.Scanner;

import javax.swing.text.StyledEditorKit.BoldAction;

public class Bai2 {

    public static void main(String[] args) {
        // Nhập số vào ArrayList . Sắp xếp lại từ lớn tới nhỏ
        ArrayList<Integer>ds=new ArrayList<Integer>();
        Integer so;
        
        Scanner sc=new Scanner(System.in);
        // chạy vòng lặp for để nhập số,kết thúc nhập bằng số 0
        for(int i=1;i>0;i=so)
        {
            System.out.print("Mời nhập số: ");
            so=sc.nextInt();
            if(so>0)
                ds.add(so);
            
        }
        // suất ds khi chưa sắp xếp để dễ so sánh 
        System.out.println("ds khi chưa sắp xếp");
        for(Integer data:ds)
        {
            System.out.print(data+"\t");
        }
        //quá trình sắp xếp
        for(int j=0;j<ds.size()-1;j++)//cho j chạy từ đầu ds -> cúi ds
        {
            for(int i=ds.size()-1;i>j;i--)//cho i chạy từ cúi ds -> tới vị trí của j 
                //vd:j=7 thì i chỉ chạy từ cúi ds tới vị trí thứ 6 thì dừng
            {
                if(ds.get(i)<ds.get(j))//so sánh giá trị của vị trí i nếu lớn hơn giá trị ở vị trí j thì 
                {
                    int giatricu=ds.get(j);//b1:thì lưu lại giá trị của vị trí j để hoán đổi
                    ds.set(j, ds.get(i));//b2:tiếp theo dùng hàm set để thay vị trí giá trị của i thành vị trí của j
                    ds.set(i, giatricu);//b3:tiếp theo là dùng set để thay vị trí giá trị của j thành vị trí của i(giá trị của j đã dc lưu ở b1)
                }
            }   
        }
        //Lưu ý : cách giải là gán 2 biến cho vị trí đầu và cúi của ArrayList
        //rồi lấy biến vị trí đầu so sánh lần lượt vs biến vị trí cúi để tìm ra 
        //giá trị lớn nhất trong ArrayList.
        //Nhớ rằng không được để biến vị trí cúi chạy vào những vị trí đã dc săp xếp
        //bằng cách gán điều kiện cho nó lớn hơn biến vị trí đầu.
        //Chỉ cần thay dấu lớn thành dấu bé sẽ sắp xếp theo vị trí từ nhỏ tới lớn.
        System.out.println("\n ds sau khi sắp xếp");
        for(Integer data:ds)
        {
            System.out.print(data+"\t");
        }
    }

}

Cho mình chút ý kiến về bài này, nó đã chạy đúng kq mong muốn rồi , nhưng mình thấy hơi dài thì phải và trình của mình củng nghỉ dc như vậy thôi nếu ai có thể làm code gọn hơn thì xin chỉ giáo .Mình chỉ cần ý tưởng ko cần viết code dùm .Thank!
Ah nếu có bài tập về ArrayList thì cho mình xin luôn nhé .Thank!

2 Likes

Cái thuật toán sắp xếp để cho tối ưu thì mình phải suy nghĩ thêm nhưng nhìn qua thì cái phần nhập của bạn mình thấy vòng lặp dừng khi nhập số nhỏ hơn hoặc bằng 0.

2 Likes

Đúng rồi mình qui định là nhập 0 là thoát mà

1 Like

Đã dùng ArrayList sao không dùng cái nó support

Collections.sort(list, new Comparator<Long>() {
    public int compare(Long o1, Long o2) {
        return o2.compareTo(o1);
    }
});
4 Likes

do mới học nên muốn luyện luôn thang for luôn nên ko dùng sort, sẵn mình luyện cái phân tích và tư duy nữa

1 Like

Vậy tham khảo các cách săp xêp dưới
http://fit.mta.edu.vn/files/FileMonHoc/B05-SapXepPhanDoan(20132251345).pdf

1 Like

Nếu học thuật toán thì nên học riêng ra và sâu hơn như bubble sort insert sort và chạy trên c ấy. Java build hết mấy cái api này r nên chả ai dùng ntn nữa đâu

1 Like

Thuật toán của em thực ra chính là bubble sort, mà hơi lạ một chút. Chưa kiểm chứng được nó thực sự đúng hay không. Nhưng độ phức tạp là N^2, tương tự bubble sort, em có thể nghiên cứu các thuật toán sort khác. Mấy thuật toán sort cơ bản này hầu như là không thay đổi gì từ trước giờ.

Nghe là tào lao hết sức, học thuật toán là phải lăn ra C gõ à ? Giờ thích gõ php hay javascript đc ko ?

1 Like

Viết trên ngôn ngữ nào cũng được. Nhưng bạn có thấy mấy quyển thuật toán họ viết trên ngôn ngữ gì k. Toàn pascal c. Khi bạn thực hành theo có thể dễ dàng xem và tra cứu. Chứ k phải convert sang ngôn ngữ khác.
Bạn nên xem lại cách dùng từ

1 Like

Mình cũng đồng tình với ý kiến của bạn @nguyenkhanhtoan . Khi học thuật toán nên học trên ngôn ngữ nào mà cơ bản nhất, Pascal hay C thì ngôn ngữ hướng thủ tục cơ bản nên về sau đọc lại nó cũng dễ hiểu hơn. Vì cái quan trọng nhất khi học tập là phải có ví dụ để não mình còn có 1 hình ảnh nào đó để đối chiếu, cái này là theo quan điểm ngôn ngữ học, cái ví dụ để đối chiếu ấy càng cơ bản càng tốt. Mình thì mình hay dùng C# để học thuật toán, vì C# cú pháp cũng giống C.

1 Like

Không cần phải xem lại, người ta hỏi thuật toán một đằng, nhảy vào bảo đi gõ trên C một nẻo ? Không tào lao thì thì là gì ?

1 Like

Thôi nào mấy a, các ý kiến của các a đều quí giá đối vs e cả, c củng dc c++ củng đều là kiến thức cả, có càng nhìu càng tốt thôi. Đừng cải nhau

Tự nhiên đọc bài này xong lại thấy hứng thú với sắp xếp, lâu nay toàn dùng bubble sort do được học từ cấp 3. Vừa ngẫm xong cái insert sort, giờ đang đọc cái merge sort thấy hay quá.

1 Like

mình chỉ thấy bạn dùng comment chi tiết quá mức thôi :grin: . Muốn comment nhiều dòng thì nền dùng /* */ với chỉ cần viết ngắn gọn là được , mà hình như thuật toán của bạn cũng không phải là bubble sort đâu, bubble sort nó so sách 2 thằng a[i] với a[i-1], cái này là Interchange Sort rồi chứ không có lạ

1 Like

Mình hay quên nên cmt chi tiết cho dễ hiểu :grinning:. Thật ra lúc làm chỉ suy nghỉ làm sao để chạy thôi chứ ko có tìm hiểu là sort gi

std:sort của C++ là adaptive merge sort thì phải

Thuật toán thì quan trọng là ý tưởng, chứ ngôn ngữ lập trình cũng chỉ là công cụ để hiện thực cái ý tưởng đó. Học thuật toán là học ý tưởng giải quyết bài toán nên dùng ngôn ngữ lập trình nào mà chẳng được.
P/S: code của bạn nhìn dài dòng do viết cái sort ở trổng nên mới thấy vậy. Sử dụng lambda thì mấy cái for sysout của bạn chỉ cần viết có 1 dòng.

1 vài chỗ có thể dùng java8, do while… để viết cho gọn, và bài này có thể dùng đệ quy nữa, nhưng bạn nói muốn luyện vòng for thì cứ theo cách như bạn thôi :))

1 Like

Không nên. Cứ “chấm sort” rồi từ từ tìm hiểu sau :slight_smile: đến C còn có qsort thì tội gì.

Fact: Interchange là biến thể (kém hơn) của Selection, vì vậy kinh điển chỉ có Selection.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?