Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在预定义数据上生成近似排序列表的算法_C#_Algorithm_Sorting - Fatal编程技术网

C# 在预定义数据上生成近似排序列表的算法

C# 在预定义数据上生成近似排序列表的算法,c#,algorithm,sorting,C#,Algorithm,Sorting,注:这是一个由两部分组成的问题的第1部分 我想更多地了解排序算法,还有什么比编码更好的方法呢!所以我想我需要一些数据来处理 我创建一些“标准”数据的方法如下:创建一定数量的项目,不确定要创建多大,但我想玩得开心,让我的计算机发出一点呻吟:D 一旦我有了这个列表,我会把它放到一个文本文件中,然后读取它来运行我的算法。我应该有4个文本文件,其中填充了相同的数据,但只是排序不同,以运行我的算法(见下文) 如果我错了,请纠正我,但我相信我需要4种不同类型的场景来分析我的算法 随机排序的数据(为此,我

注:这是一个由两部分组成的问题的第1部分

我想更多地了解排序算法,还有什么比编码更好的方法呢!所以我想我需要一些数据来处理

我创建一些“标准”数据的方法如下:创建一定数量的项目,不确定要创建多大,但我想玩得开心,让我的计算机发出一点呻吟:D

一旦我有了这个列表,我会把它放到一个文本文件中,然后读取它来运行我的算法。我应该有4个文本文件,其中填充了相同的数据,但只是排序不同,以运行我的算法(见下文)

如果我错了,请纠正我,但我相信我需要4种不同类型的场景来分析我的算法

  • 随机排序的数据(为此,我将使用knuth shuffle)
  • 反向数据(足够简单)
  • 几乎分类(不确定如何实现)
  • 少数独特(再次不确定如何处理)
这个问题是为了生成一个近似排序的列表

哪种方法最适合在预定义数据上生成近似排序的列表?

要“洗牌”已排序的列表以使其“近似排序”,请执行以下操作:

  • 创建一个可以应用于阵列部分的函数列表,如:

    求反(数组、startIndex、endIndex)
    反向(数组、开始索引、结束索引)
    Swap(数组、startIndex、endIndex)

  • 对于i,从零到数组长度的某个函数(例如
    Log(array.length)

  • 随机选择2个整数*
  • 从您想到的函数中随机选择一个函数
  • 将该函数应用于数组的那些索引

  • *注意:整数不应限制为数组大小。相反,请选择随机整数并“换行”在数组的周围——这样,在端点附近的元素将有与中间元素相同的修改机会。

    这里回答我自己的问题。
        public static T[] ShuffleBagSort<T>(T[] array, int shuffleSize)
        {
            Random r = _random;
            for (int i = 0; i < array.Length; i += shuffleSize)
            {
                //Prevents us from getting index out of bounds, while still getting a shuffle of the 
                //last set of un shuffled array, but breaks for loop if the number of unshuffled array is 1
                if (i + shuffleSize > array.Length)
                {
                    shuffleSize = array.Length - i;
    
                    if (shuffleSize <= 1) // should never be less than 1, don't think that's possible lol
                        continue;
                }
    
                if (i % shuffleSize == 0)
                {
                    for (int j = i; j < i + shuffleSize; j++)
                    {
                        // Pick random element to swap from our small section of the array.
                        int k = r.Next(i, i + shuffleSize);
                        // Swap.
                        T tmp = array[k];
                        array[k] = array[j];
                        array[j] = tmp;
                    }
                }
            }
    
            return array;
        }
    
    public static T[]ShuffleBagSort(T[]数组,int shuffleSize)
    {
    随机r=_随机;
    for(int i=0;iarray.Length)
    {
    shuffleSize=array.Length-i;
    
    if(shuffleSize几乎排序列表是Timsort(python)在现实世界中如此高效的原因,因为数据通常是“几乎排序的”。有一篇文章解释了数据熵背后的数学原理

  • 对数组进行排序
  • 开始使用气泡排序按降序排序
  • 迭代几次后停止(取决于您希望数组的“未排序”程度)
  • 添加一些随机性(每次当bubblesort想要交换两个元素时,抛硬币并执行该操作,或者不取决于结果,或者使用不同于50/50的概率)
  • 这将为您提供一个数组,该数组将在其整个范围内进行大致相同的修改,保留大部分顺序(开头的元素最少,结尾的元素最多)。这是因为bubblesort通过随机测试执行的更改将是局部的。它不会一次将整个阵列混合到与原始阵列不同的程度

    如果你想,你也可以完全随机地洗牌整个数组的部分(但不要让部分太大,因为你会完全失去顺序)

    或者,您也可以随机交换数组的整个排序部分。这将是一个有趣的测试用例,例如:

    [1,2,3,4,5,6,7,8] -> [1,2,6,7,8,3,4,5]
    

    这是用于对列表进行近似排序?或生成随机列表。@Odnxe:这是将已排序的列表转换为近似排序的列表。可能会回答我自己的问题,但我会等待,看看是否有人有更好的解决方案。