Một số thuật toán về sort mảng
Trên diễn đàn mình có đề cập đến mảng rất nhiều nhưng rất ít bài đề cập về phần sắp xếp mảng
thường thì người ta chỉ sử dụng thuật toán đơn giản về giải thuật và cách viết như
[URL='https://vi.wikipedia.org/wiki/S%E1%BA%AFp_x%E1%BA%BFp_n%E1%BB%95i_b%E1%BB%8Dt']Sắp xếp nổi bọt (bubble sort)
[URL='https://vi.wikipedia.org/wiki/S%E1%BA%AFp_x%E1%BA%BFp_ch%C3%A8n']Sắp xếp chèn (insertion sort)
[URL='https://vi.wikipedia.org/wiki/S%E1%BA%AFp_x%E1%BA%BFp_ch%E1%BB%8Dn']Sắp xếp chọn (select sort)
những thuật toán trên tuy dễ nhưng có độ phức tạp O(n2). Vậy tại sao ta không đưa ra các giải thuật sắp xếp có đô phức tạp N*logN thôi. chẳng hạn như thuật toán Sắp xếp nhanh (quicksort) mà thành viên sói biển đã đưa vào
còn có các thuật toán sắp xếp khác như
[URL='https://vi.wikipedia.org/wiki/S%E1%BA%AFp_x%E1%BA%BFp_vun_%C4%91%E1%BB%91ng']Sắp xếp vun đống (heapsort)
Nổi bọt cải tiến(shake sort)
Shell sort
Merge sort
bảng băm
sắp xếp nhị phân …
Mới chuyển 2 dạng sort sang VBA là HeapSort và SelectionSort 10000 dòng tốc độ của HeapSort hơn 2 giây so với SelectionSort
Option Explicit
Sub Swap(ByRef a As Long, ByRef B As Long)
Dim temp As Long
temp = a
a = B
B = temp
End Sub
SelectionSort
Option Explicit
Sub SelectionSort(a() As Long, ByVal N As Long)
Dim Min As Long
Dim I As Long, J As Long
For I = 0 To N - 1
Min = I
For J = I + 1 To N
If (a(J) < a(Min)) Then
Min = J
End If
Next
If (Min <> I) Then
Call Swap(a(Min), a(I))
End If
Next
End Sub
HeapSort
Option Explicit
Sub Heapify(a() As Long, ByVal N As Long, ByVal I As Long)
Dim Left As Long
Dim Right As Long
Dim Largest As Long
Left = 2 * (I + 1) - 1
Right = 2 * (I + 1)
If ((Left < N) And a(Left) > a(I)) Then
Largest = Left
Else
Largest = I
End If
If ((Right < N) And a(Right) > a(Largest)) Then
Largest = Right
End If
If (I <> Largest) Then
Call Swap(a(I), a(Largest))
Heapify a, N, Largest
End If
End Sub
Sub BuildHeap(a() As Long, ByVal N As Long)
Dim I As Long
For I = Int(N / 2) To 0 Step -1
Call Heapify(a, N, I)
Next
End Sub
Sub HeapSort(a() As Long, ByVal N As Long)
Dim I As Long
Call BuildHeap(a, N)
For I = N - 1 To 1 Step -1
Call Swap(a(0), a(I))
Call Heapify(a, I, 0)
Next
End Sub
www.giaiphapexcel.com/diendan/threads/m%E1%BB%99t-s%E1%BB%91-thu%E1%BA%ADt-to%C3%A1n-v%E1%BB%81-sort-m%E1%BA%A3ng.98887/
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học
Thuật toán Sắp xếp nổi bọt Bubble Sort
K5gpmaQg7QM
Mô phỏng thuật toán
Sắp xếp nổi bọt cải tiến ShakeSort
Sắp xếp nhanh Quick_Sort
0-7bdG4wgoM
Thuật toán Merger Sort
Call Merger_Sort(Arr, 0, n – 1)
mới nghỉ thôi không biết có đúng hay không? có thể khi chọn các kiểu sort thì nó đã ghép lại thành 1 cột tổng sau đó sort dựa vào cột tổng? đó mới là ý tưởng thôi
Ghép nhau để sort thì phải có "chiêu", không thể ghép thoải mái được (ít nhất là làm sao cho chuỗi sau khi ghép có số ký tự bằng nhau toàn bộ)
Lúc trước có lần cũng định tiếp tục vụ sort mảng này nhưng.. lười. Với lại tôi cũng chưa có nhu cầu sort 2 cột làm gì cả
Đang có ý tưởng mới, nếu code được em sẽ post lên. Đầu tiên sort theo yêu cầu 1, sau đó dùng đệ quy ngắt những dòng trùng nhau sort theo cấp độ 2, và cứ thế cho hết các cấp độ sort, hy vọng là có thể sáng
Có thể lập function
Sau đó các so sánh trong phần sort, ví dụ bubble sort ở trên ta thay
If a(j)<a(j-1) thành
If LớnHơn(a(j-1,1),a(j-1,2),a(j,1),a(j,2))
Mình để tên function tiếng Việt có dấu cho đỡ "phản cảm"!
Em cũng không rõ kiểu sort này gọi là gì nữa, dễ viết nhất. Tạm thời code so sánh tăng 2 cột A, B; đọc ghi từng ô cho tốc độ chậm lại dễ so sánh.
Nếu không chuyển vị thì có thể lập mảng 1 chiều để lập chỉ mục, chỉ chuyển vị trên mảng này, nhưng lúc ghi xuống range thì lại phải ghi từng hàng.
Chỗ
If IsNumeric(a) And IsNumeric(b) Then
SoSanh = Sgn(r(I)) * IIf(Val(a(i1, f)) <> Val(a(i2, f)), -1, 1)
Chắc phải sửa thành val(a(i1,f))<val(a(i2,f))