Thuật toán sắp xếp của Excel

Liên hệ QC

chibi

Thành viên tích cực
Thành viên danh dự
Tham gia
10/1/07
Bài viết
1,120
Được thích
622
Có ai biết Excel sắp xếp dữ liệu qua chức năng Sort như thế nào không?
 
ban sắp xếp theo tiêu chuẩn nào, mình thấy có sắp xếp theo họ tên áscending( tăng dần) còn descending ( giảm dần) theo tiêu chuẩn tiếng anh đó!
 
ongtrungducmx25 đã viết:
ban sắp xếp theo tiêu chuẩn nào, mình thấy có sắp xếp theo họ tên áscending( tăng dần) còn descending ( giảm dần) theo tiêu chuẩn tiếng anh đó!

Chibi muốn hỏi rằng thuật toán đó như thế nào ??chứ không hỏi về công cụ sắp xếp.
Ai cũng biết, sắp xếp theo tăng dần (A,B,C . .,0,1,2,3) hoặc giảm dần, từ trái qua phải. Tuy nhiên với hàng ngàn phần tử thì việc sắp xếp này xảy ra như thế nào ?? Tại sao lại thế ??

Nó giống như là xếp học sinh tập thể dục, Hiệu trưởng ra lệnh là xếp 1 hàng, Thấp đứng trước, cao đứng sau. Nếu cùng chiều cao thì khăn quàng ai dài thì đứng sau. Nếu Khăn quàng bằng nhau thì xét đến màu áo . . . .

Trong tay bạn chỉ có 1 cái thước dây, không biết trước chiều cao của học sinh, làm sao đây nhỉ ??? Ý của Hiệu trưởng rất đơn giản, thực hiện mới là một vấn đề.

Thân!
 
Cái này ko đơn gian đâu... Đã gọi là "Thuật toán" rồi thì ko phân biệt Excel hay là cái gì cả... Áp dụng dc cho mọi phần mềm và mọi hệ điều hành...
Lấy 1 VD:
Có 100 hs đang xếp thành 1 hàng, giờ hiệu trưởng yêu cầu sắp xếp theo thứ tự từ nhỏ tuổi đến lớn tuổi... Nếu là tôi thì tôi sẽ làm như sau:
1> Đánh số thứ tự từ trên xuống dưới
2> Hỏi xem em nào nhỏ tuổi nhất thì đổi vị trí với em đứng đầu hàng... vậy xem như đã xác định dc 1 em, còn lại 99 em
3> Hỏi xem em nào nhỏ tuổi nhất trong 99 em còn lại thì đổi vị trí với em thứ 2... Xác định dc em thứ 2, còn lại 98 em
4> Cứ thế mà làm đến người cuối cùng...
...
Đây là 1 thuật toán đơn giản nhất, chưa tính đến trường hợp trùng tuổi...
Mến
ANH TUẤN
 
anhtuan1066 đã viết:
Cái này ko đơn gian đâu... Đã gọi là "Thuật toán" rồi thì ko phân biệt Excel hay là cái gì cả... Áp dụng dc cho mọi phần mềm và mọi hệ điều hành...
Lấy 1 VD:
Có 100 hs đang xếp thành 1 hàng, giờ hiệu trưởng yêu cầu sắp xếp theo thứ tự từ nhỏ tuổi đến lớn tuổi... Nếu là tôi thì tôi sẽ làm như sau:
1> Đánh số thứ tự từ trên xuống dưới
2> Hỏi xem em nào nhỏ tuổi nhất thì đổi vị trí với em đứng đầu hàng... vậy xem như đã xác định dc 1 em, còn lại 99 em
3> Hỏi xem em nào nhỏ tuổi nhất trong 99 em còn lại thì đổi vị trí với em thứ 2... Xác định dc em thứ 2, còn lại 98 em
4> Cứ thế mà làm đến người cuối cùng...
...
Đây là 1 thuật toán đơn giản nhất, chưa tính đến trường hợp trùng tuổi...
Mến
ANH TUẤN
Nếu chỉ là bài toán học sinh thì cách của bác là đúng rồi.

Tuy nhiên Học sinh ở đây đại diện cho các chuỗi, nó là vô tri vô giác. Nó không biết bản thân nó, và cả người khác nữa (dài, rộng, bao nhiêu ký tự).
Muốn biết nó thì chúng ta phải đo từng phần tử (còn phải đo rất nhiều lần).
VD :
  • Học sinh = Phần tử (gồm nhiều ký tự)
  • Chiều cao học sinh = Ký tự đầu tiên
  • Tuổi học sinh = Ký tự thứ 2
  • Chiều dài khăn quàng = Ký tự thứ 3
  • . . . . . . . . . . . . . .
Khi đó học sinh cao bao nhiêu thì nó không biết, chỉ ta mới biết (dùng hàm left chẳng hạn-Một lần đo), sau đó nếu cần biết thông tin về chiều cao học sinh (ký tự đầu tiên), ta lại phải đo lần nữa.
Có nhiều cách : VD:
  1. Cho các HS (phần tử) vào một phòng nào đấy (vùng tạm), còn xếp hàng là ngoài sân (vùng chính thức-Báo cáo)
  2. Lấy đại 1 phần học sinh nào đó, cho xếp vào hàng.
  3. Lấy 1 học sinh bất kỳ thứ 2, tiến hành đo đạc so sánh và sắp xếp với học sinh số 1
  4. Lấy học sinh bất kỳ thứ 3, tiến hành đo đạc so sánh và sắp xếp với học sinh số 1. Nếu so các ĐK đứng trên HS1 thì cho đứng trên HS1. Nếu phải đứng dưới HS1 thì tiếp tục so với HS số 2 . .
  5. Lấy học sinh bất kỳ thứ 4 . . . .
  6. . . . . . . . . .
Thật là phức tạp

Và còn nhiều cách khác nữa. Chỉ cần nhớ một điều là các phần tử (số, ký tự) không biết nói, không biết về chúng và các phần tử khác.

VD : Bản thân chuỗi "GPE" không biết là chúng có mấy ký tự, ký tự đầu tiên là gì ?? Chỉ chúng ta mới biết (dựa vào hàm LEN và LEFT chẳng hạn)

Chúng ta phải là người đo đạc, so sánh, sắp xếp.

Phương pháp thì có, tuy nhiên giải thuật không đơn giản.

Thân!
 
Uh... nhưng chúng ta nên đi từ dễ đến khó... Mới bước đầu tiên mà vấp 1 gốc cây bự thì té đau lắm đó.. hi... hi... Ý tôi muốn nói đến cái việc gọi là "Thuật toán" kia chúng ta ko nên bị ám ảnh bởi kiến thức Excel hay bất cứ kiến thức nào cả... Vì nói cho cùng, thuật toán luôn có trước, chương trình là cái đi sau dựa vào những thuật toàn này, đúng ko?
Tóm lại, bạn muốn làm cái gì thì cứ xây dựng thuật toán trước đi, như thế nào là tùy bạn, miễn hợp lô-gic... Sau cùng mới "ráp" nó vào Excel (hay cái gì đó)... Riêng về sắp xếp, tuy khó nhưng xét đến tận nguồn gốc thì cũng chỉ có vài thuât toán mà thôi... Cái này mà đi hỏi người ko biết gì về máy tính có khi lại có câu trã lời cực kỳ chính xác
Mến
ANH TUẤN
 
Thử tham gia & sẽ chỉ có lợi mà thôi!

anhtuan1066 đã viết:
Uh... nhưng chúng ta nên đi từ dễ đến khó... Mới bước đầu tiên mà vấp 1 gốc cây bự thì té đau lắm đó.. hi... hi... Ý tôi muốn nói đến cái việc gọi là "Thuật toán" kia chúng ta ko nên bị ám ảnh bởi kiến thức Excel hay bất cứ kiến thức nào cả...
Dùng 2 vòng lặp;
Vòng ngoài từ ij= 1 đến 100;
Vòng trong từ iZ =iJ +1 đến 100
hể cứ thành viên thứ ij > iZ thí chuyển vị; ngược lại
sẽ ghi vô cột KQ Value tại iJ nếu nó bé nhất!
 
SA_DQ đã viết:
Dùng 2 vòng lặp;
Vòng ngoài từ ij= 1 đến 100;
Vòng trong từ iZ =iJ +1 đến 100
hể cứ thành viên thứ ij > iZ thí chuyển vị; ngược lại
sẽ ghi vô cột KQ Value tại iJ nếu nó bé nhất!

Nếu chỉ sắp xếp theo một tiêu thức (một trường/cột) thì là như vậy. Vấn đề mọi người muốn sắp xếp phối hợp cả 2,3,4 cột cơ bác ạ.
Không phải tự nhiên mà Excel chỉ cho phép sắp xếp phối hợp tối đa là 3 tiêu thức. Như các bạn nói, đây là thuật toán.;;;;;;;;;;;
Vấn đề này rất khó!!!
 
TuanVNUNI đã viết:
Nếu chỉ sắp xếp theo một tiêu thức (một trường/cột) thì là như vậy. Vấn đề mọi người muốn sắp xếp phối hợp cả 2,3,4 cột cơ bác ạ.
Không phải tự nhiên mà Excel chỉ cho phép sắp xếp phối hợp tối đa là 3 tiêu thức. Như các bạn nói, đây là thuật toán.;;;;;;;;;;;
Vấn đề này rất khó!!!

Rất đúng, Excel thì cho 3 ĐK, ASAP cho 5 điều kiện, lại còn cho thêm là phân biệt chữ thường chữ hoa nữa.

Code của ASAP thì em có, nhưng . . . . không hiểu.

Thân!
 
chibi đã viết:
Có ai biết Excel sắp xếp dữ liệu qua chức năng Sort như thế nào không?
Mình cũng chưa từng xem tài liệu nào nói vấn đề này, những gì nêu dưới đây chỉ là kinh nghiệm, có thể sai !
A. Sắp xếp trong 1 cột:
Trật tự sắp xếp từ nhỏ đến lớn (Ascending):
1. Số
2. Dấu -
3. Khoảng trắng
4. Các ký tự không phải là chữ cái trên bàn phím (~ ! @ # $ ...)
5. Chữ cái A-Z (cùng chữ cái : chữ hoa trước chữ thường)
6. 2 ô giống nhau thì ô nào trước khi xếp ở trên, sau khi xếp cũng ở trên.
Nếu sắp xếp Descending thì theo thứ tự ngược lại.
Khi sắp xếp, tùy loại dữ liệu:
Số: số từ nhỏ đến lớn
Chuỗi: xếp theo từng ký tự từ bên trái sang phải.
Chú ý trường hợp giá trị là số nhưng Excel xem như chuỗi (text) do dùng các hàm chuỗi tách số từ 1 chuỗi (dùng hàm LEFT, RIGHT, MID, ...) hoặc dùng ký tự định dạng như '100 thì Excel xếp như chuỗi. Ví dụ xếp chuỗi số từ 1 đến 20 thì Excel xếp 1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 2, 20, 3, 4, 5, 6, 7, 8, 9
B. Sắp xếp nhiều cột (tối đa 3 cột):
1. Sắp xếp cột Sort by trước.
2. Những ô có dữ liệu giống nhau sau khi sắp xếp Sort by, sắp xếp theo Then by đầu tiên.
3. Những ô có dữ liệu giống nhau sau khi sắp xếp Sort by, Then by đầu tiên, sắp xếp theo Then by cuối cùng.

Trên đây chỉ xét đến số, ký tự trên bàn phím. Không xét đến các ký tự tiếng Việt, ký tự khác nhập vào bằng Insert Symbol hoặc tổ hợp phím Alt+phím số vì thứ tự không theo quy luật nào.

Còn về thuật toán, tôi cũng xây dựng giống như anhtuan1066. Khi so sánh 2 giá trị với nhau, Excel so sánh bằng các toán tử >, <, = để xem giá trị nào xếp trên, xếp dưới. Nếu là số thì so sánh theo giá trị, nếu là chuỗi thì so sánh 2 chuỗi theo trật tự sắp xếp ABC (không cần tách từng ký tự để so sánh). Từ đó quyết định xếp trên hoặc dưới. Ví dụ xếp từ nhỏ đến lớn (Ascending):
100 > 123 cho kết quả FALSE. Xếp 100, 123
"A" > 123 cho kết quả TRUE. Xếp 123, "A"
"ABC" > "AACZ" cho kết quả TRUE. Xếp "AACZ", "ABC"
 
Lần chỉnh sửa cuối:
Xin nêu một bài toán mong được cùng trao đổi
Cho một danh sách gồm các cột: Họ tên, ngày sinh, field1, field2, field3
và có 10 dòng dữ liệu.
Yêu cầu: Sắp xếp lại danh sách theo "Họ tên" (Không tính đến nhu cầu sắp xếp theo tiếng Việt).
 
chibi đã viết:
Xin nêu một bài toán mong được cùng trao đổi
Cho một danh sách gồm các cột: Họ tên, ngày sinh, field1, field2, field3
và có 10 dòng dữ liệu.
Yêu cầu: Sắp xếp lại danh sách theo "Họ tên" (Không tính đến nhu cầu sắp xếp theo tiếng Việt).

Đây là giải bài toán cụ thể, vậy bác cho VD đi.

Thân!
 
Ví dụ trong file đính kèm.
Bác Bill đã làm như thế nào để từ "Vùng 1" sau khi sort ra được "Vùng 2" ?
 

File đính kèm

  • Sort.xls
    15 KB · Đọc: 83
chibi đã viết:
Ví dụ trong file đính kèm.
Bác Bill đã làm như thế nào để từ "Vùng 1" sau khi sort ra được "Vùng 2" ?

Bác Bill đã làm như thế nào để từ "Vùng 1" sau khi sort ra được "Vùng 2" ??


Cái này mới quan trọng. Chắc phải nhờ các cao thủ thôi.

P/S :
Còn nếu không hôm nào em rủ Bill qua VN nhậu rồi mời bác đi nhậu luôn. Có gì hỏi Bill dễ hơi (không biết nhậu vào có nhớ không ??--=0)

Thân!
 
chibi đã viết:
Ví dụ trong file đính kèm.
Bác Bill đã làm như thế nào để từ "Vùng 1" sau khi sort ra được "Vùng 2" ?
Không rõ ý bạn là làm như thế nào để từ "Vùng 1" sau khi sort ra được "Vùng 2" hay "Vung 1" giống như "Vùng 2" ?
Nếu "Vung 1" giống như "Vùng 2" thì có nhận xét:
Sắp xếp tăng dần A2:A12, cụ thể xếp theo thứ tự họ (Lê > Nguyễn, Trần, Vũ)
Do đó dùng sort như sau:
Chọn A2:D12
Menu Data > Sort
chọn Sort by : Ho ten, chọn Ascending
OK
 
Có lẽ chibi ko phải muốn tìm hiểu về Sort mà muốn biết bằng cách nào Bill làm dc như thế đấy!
Nếu là tôi thì tôi sẽ làm như sau:
1> Đầu tiên phải có 1 cái gì đó tạm gọi là TIÊN ĐỀ, chính là những ký tự A, B, C 26 chử cái dc sắp xếp sẳn xem như là mặc định (ko có món này thì Bill cũng đành bó tay)
2> Theo cơ sở trên thì chử A đứng trước B... B đứng trước C nếu là sắp xếp tăng dần... và ngược lai đối với giảm dần...
3> Tôi sẽ xem trong nhóm n phần tử em nào có ký tự đầu tiên nhỏ nhất thì "lôi cổ" ra riêng 1 bên... Nếu cùng ký tự đầu thì xét tiếp ký tự thứ 2.. và cứ thế.. đến khi nào tìm dc "thằng" nhỏ nhất... Nếu 2 thằng trùng nhau hoàn toàn tôi sẽ lấy ngẩu nhiên 1 đứa, còn đứa kia tạm chấp nhận vị trí thứ 2
4> Khi lấy ra dc 1 đứa rồi thì tôi còn lại n-1 phần tử... Lại tiếp tục giống như bước 3... cứ thế đến em cuối cùng
Ko biết Bắp nghĩ sao? Cái này là VD khá đơn giản, còn phức tạp hơn chắc hơi bị.. tê!
Chibi cho hỏi: Bạn nêu câu hỏi này là đễ làm gì vậy? Tất nhiên bạn phải có ý tưởng gì đó chuẩn bị làm nên mới hỏi... chứ chẳng lẽ hỏi.. đễ chơi... Vậy có thể chia sẽ ý tưởng với mọi người ko?
ANH TUẤN
 
anhtuan1066 đã viết:
Có lẽ chibi ko phải muốn tìm hiểu về Sort mà muốn biết bằng cách nào Bill làm dc như thế đấy!
Nếu là tôi thì tôi sẽ làm như sau:
1> Đầu tiên phải có 1 cái gì đó tạm gọi là TIÊN ĐỀ, chính là những ký tự A, B, C 26 chử cái dc sắp xếp sẳn xem như là mặc định (ko có món này thì Bill cũng đành bó tay)
2> Theo cơ sở trên thì chử A đứng trước B... B đứng trước C nếu là sắp xếp tăng dần... và ngược lai đối với giảm dần...
3> Tôi sẽ xem trong nhóm n phần tử em nào có ký tự đầu tiên nhỏ nhất thì "lôi cổ" ra riêng 1 bên... Nếu cùng ký tự đầu thì xét tiếp ký tự thứ 2.. và cứ thế.. đến khi nào tìm dc "thằng" nhỏ nhất... Nếu 2 thằng trùng nhau hoàn toàn tôi sẽ lấy ngẩu nhiên 1 đứa, còn đứa kia tạm chấp nhận vị trí thứ 2
4> Khi lấy ra dc 1 đứa rồi thì tôi còn lại n-1 phần tử... Lại tiếp tục giống như bước 3... cứ thế đến em cuối cùng
Ko biết Bắp nghĩ sao? Cái này là VD khá đơn giản, còn phức tạp hơn chắc hơi bị.. tê!
Chibi cho hỏi: Bạn nêu câu hỏi này là đễ làm gì vậy? Tất nhiên bạn phải có ý tưởng gì đó chuẩn bị làm nên mới hỏi... chứ chẳng lẽ hỏi.. đễ chơi... Vậy có thể chia sẽ ý tưởng với mọi người ko?
ANH TUẤN

Thì nguyên lý đúng là như thế, lại còn có cả so sánh thêm các chỉ tiêu khác. Tuy nhiên cụ thể ra sao (mô tả thuật toán từng bước) mới là là . . tê.

Bác Bill chi đánh mỗi chữ SORT, thế mà ra hết, không biết trong chữ SORT này cụ thể như thế nào ??? Chắc là tràng giang đại hải luôn.

Bác chibi định làm gì thế ???

Thân!
 
Nếu tôi nhớ ko lầm thi trong môn lập trình C có hướng dẩn qua món này... Nghĩa là tự Sort lấy khi trong tay chưa có bất cứ công cụ gì cả... Tôi chỉ nghe thoáng qua thôi chứ chưa học... cái gì gì đó về thuật toán "vét cạn"... "nỗi lên nỗi xuống" gì đó... chẳng biết nữa... nhưng tôi biết chắc là họ có làm dc như thế khi trong tay ko có công cụ (trừ hàm IF và các toán tử AND, OR... vân vân xem như mặc định)
Cay nhỉ?
ANH TUẤN
 
Các bạn ơi, nghiên cứu Excel 2007 chưa? SORT của Excel 2007 "bao la" lắm, muốn bao nhiêu điều kiện cũng được hay sao đấy, không chỉ có 3 điều kiện đâu. <br>
 
Web KT
Back
Top Bottom