请问如何获得快速排序之后原数组的索引?

mjzxlmg 2021-03-08 11:02:10
请问如何获得快速排序之后原数组的索引?
#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
...全文
470 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
JDD1997 2021-04-12
  • 打赏
  • 举报
回复

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
lyjk1984723 2021-03-18
  • 打赏
  • 举报
回复
最笨的可以弄个数组装原序号,随排序走
wanghui0380 2021-03-09
  • 打赏
  • 举报
回复
代码我们就不看了 1.你写vb,俺们已经好多年不写vb了 2.这功能linq本身可以做,它本身就是快排,所以我们也不会自己手写 换成C#的demo
 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);
三楼の郎 2021-03-09
  • 打赏
  • 举报
回复
虽然不知道你想干什么,不外乎你在用swap函数实现data数组元素交换的同时把indexArr数组的元素也同等交换下就好了

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧