16,554
社区成员
发帖
与我相关
我的任务
分享
#Region "快速排序"
Sub test()
Dim data() As Integer = {80, 74, 95, 106, 110, 46, 87, 100, 99, 54, 68}
Dim indexArr() As Integer = Enumerable.Range(0, data.Length).ToArray 'data未排序之前索引
QuickSortRelaxImproved(data, indexArr)
'请问:如何在下面的快速排序代码中加入indexArr(?)=?,使之能记录排序之前的索引 ,以便根据此索引作其它处理
End Sub
Public Sub QuickSortRelaxImproved(Of TKey)(data() As TKey, indexArr() As Integer, Optional Ascending As Boolean = False)
QuickSortRelaxImproved(data, 0, UBound(data), indexArr, Ascending)
End Sub
Public Sub QuickSortRelaxImproved(Of TKey)(data() As TKey, low As Integer, high As Integer, indexArr() As Integer, Ascending As Boolean)
If low >= high Then Return
Dim Asc As Integer
Dim Desc As Integer
If Ascending = True Then '升序
Asc = -1
Desc = 1
Else '降序
Asc = 1
Desc = -1
End If
Dim temp As TKey = data((low + high) \ 2)
Dim i As Integer = low - 1
Dim j As Integer = high + 1
Dim index As Integer = (low + high) \ 2
Do
i += 1
Do While Comparer.Default.Compare(temp, data(i)) = Desc
i += 1
Loop
j -= 1
Do While Comparer.Default.Compare(temp, data(j)) = Asc
j -= 1
Loop
If i >= j Then Exit Do
Swap(data, i, j)
If i = index Then
index = j
ElseIf j = index Then
index = i
End If
Loop
If j = i Then
QuickSortRelaxImproved(data, j + 1, high, indexArr, Ascending)
QuickSortRelaxImproved(data, low, i - 1, indexArr, Ascending)
Else
If index >= i Then
If index <> i Then
Swap(data, index, i)
End If
QuickSortRelaxImproved(data, i + 1, high, indexArr, Ascending)
QuickSortRelaxImproved(data, low, i - 1, indexArr, Ascending)
Else
If index <> j Then
Swap(data, index, j)
End If
QuickSortRelaxImproved(data, j + 1, high, indexArr, Ascending)
QuickSortRelaxImproved(data, low, j - 1, indexArr, Ascending)
End If
End If
End Sub
Private Sub Swap(Of TKey)(data() As TKey, low As Integer, high As Integer)
Dim temp As TKey = data(low)
data(low) = data(high)
data(high) = temp
End Sub
#End Region
using System.Diagnostics;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main
(
string[] args
)
{
int[] dataArray = new int[] { 80, 74, 95, 106, 110, 46, 87, 100, 99, 54, 68 };
var results = Enumerable.Range(0, dataArray.Length)
.Zip(dataArray,
(
int index,
int data
) => new {index, data})
.OrderBy(v => v.data);
foreach (var resultItem in results)
{
Debug.Print($"原始索引:{resultItem.index},数据值:{resultItem.data}");
}
}
}
}
输出:
原始索引:5,数据值:46
原始索引:9,数据值:54
原始索引:10,数据值:68
原始索引:1,数据值:74
原始索引:0,数据值:80
原始索引:6,数据值:87
原始索引:2,数据值:95
原始索引:8,数据值:99
原始索引:7,数据值:100
原始索引:3,数据值:106
原始索引:4,数据值:110
以下vb是通过https://converter.telerik.com/自动转换得来的,未测试
Imports System.Diagnostics
Imports System.Linq
Namespace ConsoleApp1
Class Program
Private Shared Sub Main(ByVal args As String())
Dim dataArray As Integer() = New Integer() {80, 74, 95, 106, 110, 46, 87, 100, 99, 54, 68}
Dim results = Enumerable.Range(0, dataArray.Length).Zip(dataArray, Function(ByVal index As Integer, ByVal data As Integer) New With {index, data
}).OrderBy(Function(v) v.data)
For Each resultItem In results
Debug.Print($"原始索引:{resultItem.index},数据值:{resultItem.data}")
Next
End Sub
End Class
End Namespace
int[] data = new int[] {80, 74, 95, 106, 110, 46, 87, 100, 99, 54, 68};
var result = data.Select((value, index) => new {index, value}).OrderBy(p => p.value);