从入门到精通:VB编程中的十大经典排序算法全解析

从入门到精通:VB编程中的十大经典排序算法全解析

排序算法是计算机科学中最基础且重要的算法之一,它们在数据处理的各个环节中扮演着关键角色。在VB编程中,掌握多种排序算法不仅能提升代码的效率,还能增强编程能力。本文将深入解析VB编程中的十大经典排序算法,从基础概念到实际应用,帮助读者从入门到精通。

1. 冒泡排序(Bubble Sort)

冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行,直到没有再需要交换的元素为止。

Sub BubbleSort(ByRef arr() As Integer)

Dim n As Integer = arr.Length

For i As Integer = 0 To n - 1

For j As Integer = 0 To n - i - 1

If arr(j) > arr(j + 1) Then

Dim temp As Integer = arr(j)

arr(j) = arr(j + 1)

arr(j + 1) = temp

End If

Next

Next

End Sub

2. 选择排序(Selection Sort)

选择排序是一种简单直观的排序算法。它的工作原理是:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

Sub SelectionSort(ByRef arr() As Integer)

Dim n As Integer = arr.Length

For i As Integer = 0 To n - 1

Dim minIndex As Integer = i

For j As Integer = i + 1 To n - 1

If arr(j) < arr(minIndex) Then

minIndex = j

End If

Next

If minIndex <> i Then

Dim temp As Integer = arr(i)

arr(i) = arr(minIndex)

arr(minIndex) = temp

End If

Next

End Sub

3. 插入排序(Insertion Sort)

插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

Sub InsertionSort(ByRef arr() As Integer)

Dim i As Integer, j As Integer

Dim key As Integer

For i = 1 To arr.Length - 1

key = arr(i)

j = i - 1

While j >= 0 AndAlso arr(j) > key

arr(j + 1) = arr(j)

j = j - 1

End While

arr(j + 1) = key

Next

End Sub

4. 希尔排序(Shell Sort)

希尔排序是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。它的工作原理是:将整个待排序的记录序列分割成若干子序列分别进行插入排序。

Sub ShellSort(ByRef arr() As Integer)

Dim n As Integer = arr.Length

Dim gap As Integer

gap = n \ 2

While gap > 0

For i As Integer = gap To n - 1

Dim temp As Integer = arr(i)

Dim j As Integer

While j >= gap AndAlso arr(j - gap) > temp

arr(j) = arr(j - gap)

j = j - gap

End While

arr(j) = temp

Next

gap = gap \ 2

End While

End Sub

5. 归并排序(Merge Sort)

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。

Sub MergeSort(ByRef arr() As Integer, ByVal left As Integer, ByVal right As Integer)

If left < right Then

Dim mid As Integer = (left + right) \ 2

MergeSort(arr, left, mid)

MergeSort(arr, mid + 1, right)

Merge(arr, left, mid, right)

End If

End Sub

Sub Merge(ByRef arr() As Integer, ByVal left As Integer, ByVal mid As Integer, ByVal right As Integer)

Dim n1 As Integer = mid - left + 1

Dim n2 As Integer = right - mid

Dim L(1 To n1) As Integer, R(1 To n2) As Integer

For i As Integer = 1 To n1

L(i) = arr(left + i - 1)

Next

For j As Integer = 1 To n2

R(j) = arr(mid + j)

Next

Dim i As Integer = 1, j As Integer = 1, k As Integer = left

While i <= n1 AndAlso j <= n2

If L(i) <= R(j) Then

arr(k) = L(i)

i = i + 1

Else

arr(k) = R(j)

j = j + 1

End If

k = k + 1

End While

While i <= n1

arr(k) = L(i)

i = i + 1

k = k + 1

End While

While j <= n2

arr(k) = R(j)

j = j + 1

k = k + 1

End While

End Sub

6. 快速排序(Quick Sort)

快速排序是一种分而治之的排序算法。它将原始数组分为较小和较大的两个子数组,然后递归地对这两个子数组进行快速排序。

Sub QuickSort(ByRef arr() As Integer, ByVal left As Integer, ByVal right As Integer)

If left < right Then

Dim pivot As Integer = Partition(arr, left, right)

QuickSort(arr, left, pivot - 1)

QuickSort(arr, pivot + 1, right)

End If

End Sub

Function Partition(ByRef arr() As Integer, ByVal left As Integer, ByVal right As Integer) As Integer

Dim pivot As Integer = arr(right)

Dim i As Integer = left - 1

For j As Integer = left To right - 1

If arr(j) <= pivot Then

i = i + 1

Dim temp As Integer = arr(i)

arr(i) = arr(j)

arr(j) = temp

End If

Next

Dim temp As Integer = arr(i + 1)

arr(i + 1) = arr(right)

arr(right) = temp

Return i + 1

End Function

7. 堆排序(Heap Sort)

堆排序是一种利用堆这种数据结构的排序算法。堆是一种近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

Sub HeapSort(ByRef arr() As Integer)

Dim n As Integer = arr.Length

' Build heap (rearrange array)

For i As Integer = n \ 2 - 1 To 0 Step -1

Heapify(arr, n, i)

Next

' One by one extract an element from heap

For i As Integer = n - 1 To 0 Step -1

' Move current root to end

Dim temp As Integer = arr(0)

arr(0) = arr(i)

arr(i) = temp

' call max heapify on the reduced heap

Heapify(arr, i, 0)

Next

End Sub

Sub Heapify(ByRef arr() As Integer, ByVal n As Integer, ByVal i As Integer)

Dim largest As Integer = i ' Initialize largest as root

Dim l As Integer = 2 * i + 1 ' left = 2*i + 1

Dim r As Integer = 2 * i + 2 ' right = 2*i + 2

' If left child is larger than root

If l < n AndAlso arr(l) > arr(largest) Then

largest = l

End If

' If right child is larger than largest so far

If r < n AndAlso arr(r) > arr(largest) Then

largest = r

End If

' If largest is not root

If largest <> i Then

Dim swap As Integer = arr(i)

arr(i) = arr(largest)

arr(largest) = swap

' Recursively heapify the affected sub-tree

Heapify(arr, n, largest)

End If

End Sub

8. 桶排序(Bucket Sort)

桶排序是一种利用数组的排序算法。其原理是将待排序数据分到几个有序的桶里,每个桶再分别排序。

Sub BucketSort(ByRef arr() As Integer)

Dim n As Integer = arr.Length

Dim max As Integer = arr.Max()

Dim min As Integer = arr.Min()

Dim bucketCount As Integer = (max - min + 1) \ 10

Dim bucket(bucketCount - 1) As List(Of Integer)

' Insert numbers into buckets

For Each num As Integer In arr

bucket((num - min) \ 10).Add(num)

Next

Dim index As Integer = 0

For Each bucket In buckets

If bucket.Count > 0 Then

bucket.Sort()

For Each num As Integer In bucket

arr(index) = num

index = index + 1

Next

End If

Next

End Sub

9. 计数排序(Counting Sort)

计数排序是一种非比较整数排序算法,其原理是建立在一个假设之上:待排序的每个元素的值都是0到某个非负数x之间的整数。

Sub CountingSort(ByRef arr() As Integer)

Dim n As Integer = arr.Length

Dim max As Integer = arr.Max()

Dim min As Integer = arr.Min()

Dim count(max - min) As Integer

' Initialize count array

For i As Integer = 0 To max - min

count(i) = 0

Next

' Store the count of each element

For i As Integer = 0 To n - 1

count(arr(i) - min) = count(arr(i) - min) + 1

Next

' Change count[i] so that count[i] now contains actual

' position of this element in output array

For i As Integer = 1 To max - min

count(i) = count(i) + count(i - 1)

Next

Dim output(n) As Integer

For i As Integer = n - 1 To 0 Step -1

output(count(arr(i) - min) - 1) = arr(i)

count(arr(i) - min) = count(arr(i) - min) - 1

Next

' Copy the output array to arr

For i As Integer = 0 To n - 1

arr(i) = output(i)

Next

End Sub

10. 基数排序(Radix Sort)

基数排序是非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数进行比较排序。

Sub RadixSort(ByRef arr() As Integer)

Dim max As Integer = arr.Max()

' Do counting sort for every digit

Dim exp As Integer = 1

While max \ exp > 0

CountingSort(arr, exp)

exp = exp * 10

End While

End Sub

Sub CountingSort(ByRef arr() As Integer, ByVal exp As Integer)

Dim n As Integer = arr.Length

Dim output(n) As Integer

Dim count(10) As Integer

' Initialize count array as 0

For i As Integer = 0 To 9

count(i) = 0

Next

' Store count of occurrences in count[]

For i As Integer = 0 To n - 1

count((arr(i) \ exp) Mod 10) = count((arr(i) \ exp) Mod 10) + 1

Next

' Change count[i] so that count[i] now contains actual

' position of this digit in output[]

For i As Integer = 1 To 9

count(i) = count(i) + count(i - 1)

Next

' Build the output array

For i As Integer = n - 1 To 0 Step -1

output(count((arr(i) \ exp) Mod 10) - 1) = arr(i)

count((arr(i) \ exp) Mod 10) = count((arr(i) \ exp) Mod 10) - 1

Next

' Copy the output array to arr[]

For i As Integer = 0 To n - 1

arr(i) = output(i)

Next

End Sub

总结

通过本文的详细解析,读者应该对VB编程中的十大经典排序算法有了全面的理解。每种排序算法都有其独特的特点和适用场景,选择合适的排序算法对于优化程序性能至关重要。在实际编程中,应根据具体需求和数据特性来选择最合适的排序算法。

相关文章