Bàn về thuật toán sort mảng (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,723
Giới tính
Nam
Hổm rày chưa thấy đề tài nào sôi nổi, giờ thử đố một đề tài xem có tạo hứng thú cho mọi người không.

Nếu tôi có một chuỗi với các số (dương) lộn xộn:

Chuỗi = "1, 8, 6, 4, 5, 11, 12, 13, 16, 15, 20, 14, 10, 7"

Giờ, tôi sẽ viết hàm như thế nào để dãy số trên được lược lại, và có kết quả như dưới?

Kết quả = "1, 4-8, 10-16, 20"

Các bạn thử xem nào!
 
Lần chỉnh sửa cuối:
Anh siwtom à!
Anh và em quen nhau trên diễn đàn này, thời gian tuy không dài nhưng cũng đủ để anh hiểu được con người em không phải thuộc loại thích bắt bẻ từng câu chữ.
Em tôn trọng anh vì kiến thức của anh... Em HỎI nhằm mục đích để HỌC. Em thấy "lúng túng" thì nói là "lúng túng"
Không ngờ chỉ câu hỏi nhỏ của em lại khiến anh mất bình tỉnh đến vậy
Thôi thì em xin lỗi... Hứa rằng sẽ không hỏi thêm gì nữa

Không, ít nhất là trong bài đầu, Tuấn không hỏi mà là Tuấn đánh giá. Tất nhiên Tuấn "mượn" những người khác "phàn nàn" chứ không phải Tuấn phàn nàn.

Trong bài 843 có 1 câu hỏi. Trong bài 841 và 845 chỉ có những câu khẳng định chứ không có câu hỏi nào. Nếu không có bài 842 của tôi thì sẽ chỉ có 1 bài 841 với lời đánh giá mà thôi. Phải nhìn theo tuần tự lịch sử thì mới biết là hỏi hay đánh giá.


Tôi cũng kết thúc ở đây
 
Lần chỉnh sửa cuối:
Upvote 0
-
Ngoài lề: Có dịp phải phạt ku Nghĩa! Vì cứ bài nào chú mày "khơi mào" là y như rằng có tranh chấp (có hiện tượng nóng lên toàn cầu)...
Chú phải "kiểm điểm" bản thân đi nha (bằng 1 chầu gì đó cũng được)
 
Upvote 0
-
Ngoài lề: Có dịp phải phạt ku Nghĩa! Vì cứ bài nào chú mày "khơi mào" là y như rằng có tranh chấp (có hiện tượng nóng lên toàn cầu)...
Chú phải "kiểm điểm" bản thân đi nha (bằng 1 chầu gì đó cũng được)
Đồng ý với Thầy ndu
Chú Nghĩa chở bạn gái rủ mình & ku Tùng, ku Leo......... đi Biên Hòa kêu ku Thương ra............phạt một bữa
Từ hôm sinh nhật đến nay chưa "óp- iếc" gì cả, nhớ nhớ. À mà ku Nhím về Sì- Gòn chưa nhỉ, chẳng thấy tăm hơi đau cả ??????????
"Chết mẹ", cái này xì- pam rồi
 
Upvote 0
Mã:
Sub Test()
    Dim Arr1, Arr2 As Variant
    Arr1 = Array(1, 2, 3, 4, 5, 6, 7, 10, 11)
    Arr2 = Split("1,2,3,4,5,6,7,10,11", ",")
    QuickSort1DArray Arr1, False
    Debug.Print Join(Arr1, ",")
    QuickSort1DArray Arr2, False
    Debug.Print Join(Arr2, ",")
End Sub

Thủ tục trên, với 2 mảng, cho ra kết quả khác nhau.

Xin hỏi các bạn, bằng cách nào mà hàm QuickSort1DArray nó hiểu đâu là số trong dạng chuỗi để chuyển lại cho đúng là số từ nguồn mảng Split?
 
Upvote 0
Mã:
Sub Test()
    Dim Arr1, Arr2 As Variant
    Arr1 = Array(1, 2, 3, 4, 5, 6, 7, 10, 11)
    Arr2 = Split("1,2,3,4,5,6,7,10,11", ",")
    QuickSort1DArray Arr1, False
    Debug.Print Join(Arr1, ",")
    QuickSort1DArray Arr2, False
    Debug.Print Join(Arr2, ",")
End Sub

Thủ tục trên, với 2 mảng, cho ra kết quả khác nhau.

Xin hỏi các bạn, bằng cách nào mà hàm QuickSort1DArray nó hiểu đâu là số trong dạng chuỗi để chuyển lại cho đúng là số từ nguồn mảng Split?
Như vậy là THÊM VIỆC không cần thiết cho hàm
Nghĩa cứ nghĩ xem: Ngay cả công cụ sort của Excel khi làm việc cũng phân biệt rõ ràng chuổi và số mà
Vậy, muốn nó sort đúng "ý mình" thì cứ chuyển các phần tử của Arr2 thành số trước đi ---> Có tốn công sức gì đâu ---> Vì nếu "chiều ý" của Nghĩa thì hàm sẽ không mang tính tổng quát (mình chú xài)
 
Upvote 0
Như vậy là THÊM VIỆC không cần thiết cho hàm
Nghĩa cứ nghĩ xem: Ngay cả công cụ sort của Excel khi làm việc cũng phân biệt rõ ràng chuổi và số mà
Vậy, muốn nó sort đúng "ý mình" thì cứ chuyển các phần tử của Arr2 thành số trước đi ---> Có tốn công sức gì đâu ---> Vì nếu "chiều ý" của Nghĩa thì hàm sẽ không mang tính tổng quát (mình chú xài)

Tổng quát chứ Thầy, bởi trong một mảng vừa chuỗi vừa số, ta sắp xếp chúng có trật tự hơn vì chúng tự biết đâu là chuỗi, đâu là số dạng chuỗi. Còn việc em đưa ra cái mảng đó mà xử lý thì em đưa trường hợp đó lên đây làm gì nữa Thầy ơi, bởi ngay cái tên Sub đã nói rằng Sort mảng 1 chiều, vậy cái mảng Arr2 chẳng phải là mảng 1 chiều sao? Hay là ta phải ghi chú rằng Sub này sẽ không Sort được chính xác mảng từ hàm Split xuất ra?
 
Lần chỉnh sửa cuối:
Upvote 0
Tổng quát chứ Thầy, bởi trong một mảng vừa chuỗi vừa số, ta sắp xếp chúng có trật tự hơn vì chúng tự biết đâu là chuỗi, đâu là số dạng chuỗi. Còn việc em đưa ra cái mảng đó mà xử lý thì em đưa trường hợp đó lên đây làm gì nữa Thầy ơi, bởi ngay cái tên Sub đã nói rằng Sort mảng 1 chiều, vậy cái mảng Arr2 chẳng phải là mảng 1 chiều sao? Hay là ta phải ghi chú rằng Sub này sẽ không Sort được chính xác mảng từ hàm Split xuất ra?
Bạn thử dòng lệnh này sẽ biết các phần tử của mảng do hàm Split xuất ra có kiểu dữ liệu gì.
Mã:
Debug.Print TypeName(Split("1,2,3", ",")(1))
Đọc từ đầu tới cuối topic này cứ thấy sao sao ấy...
 
Upvote 0
Tổng quát chứ Thầy, bởi trong một mảng vừa chuỗi vừa số, ta sắp xếp chúng có trật tự hơn vì chúng tự biết đâu là chuỗi, đâu là số dạng chuỗi. Còn việc em đưa ra cái mảng đó mà xử lý thì em đưa trường hợp đó lên đây làm gì nữa Thầy ơi, bởi ngay cái tên Sub đã nói rằng Sort mảng 1 chiều, vậy cái mảng Arr2 chẳng phải là mảng 1 chiều sao? Hay là ta phải ghi chú rằng Sub này sẽ không Sort được chính xác mảng từ hàm Split xuất ra?

Nếu bạn nói tới sub của tôi, mà chắc là thế vì trong bài #84 bạn ghi rõ tên, thì tôi trả lời thế này:

1. Bạn nói đúng. Sub này sẽ không Sort được chính xác mảng từ hàm Split xuất ra theo như ý muốn của bạn. Tôi thú nhận như thế bạn đã hài lòng chưa? Bạn có thể quên nó đi được rồi. Bạn có bao nhiêu lựa chọn cơ mà?

2. Sub của tôi sort theo kiểu số nếu mảng vào là mảng toàn số, còn nếu là mảng toàn chuỗi thì sort theo kiểu chuỗi.

Tôi đã viết trong bài #45 là Split trả về mảng chuỗi

Các bạn dùng chuỗi nhưng các bạn lại lại "bắt" 3 < 20, tức coi 3 và 20 như số nên bắt buộc tôi phải sort mảng số. Vì tmp là mảng chuỗi nên tôi phải tạo mảng số Arr
...
For k = 1 To 60000
a = ""
tmp = Split("1,9,1,2,1,8,16,4,3,11,11,9,5,11,12,13,16,15,20,15,14,10,7,20", ",")

vậy kết quả sẽ không dành cho bạn.

Sub của tôi không kiểm tra xem liệu dữ liệu có đổi thành số được không. Cũng không có ý định đổi bất cứ cái gì thành số, thậm chí khi có thể. Có 3 lý do:

a. Tôi cho rằng việc tạo một mảng đúng ý để truyền vào sub là không khó, không mất nhiều thời gian. Chả lý gì sub lại đi làm cái việc không đâu.

b. Tôi là tác giả, dụng ý của tôi là thế. Nếu bạn thấy hay thì dùng, không hay thì bỏ qua. Không ai dí súng vào đầu bạn bắt bạn phải dùng cả.

c. Tôi có ý muốn quái đản thế đấy. Tôi viết theo ý thích của tôi. Tôi có quyền quá đi chứ. Bạn dùng hoặc đá đít nó chứ bạn có quyền gì đòi hỏi. Tôi đã nói là tôi viết thế và không sửa nữa.

Trong chủ đề này tôi đã mất nhiều thời gian. Tôi sẽ không trả lời bạn và bất cứ ai nữa. Dù bạn hay bất cứ ai có viết gì thêm nữa. Chấm hết là hết.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom