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

时间:2011-08-13 01:13:31

标签: c# algorithm sorting

注意:这是2部分问题的第1部分。

Part 2 here

我想要更多地关于排序算法以及比编码更好的方法!所以我想我需要一些数据来处理。

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

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

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

  • 随机排序的数据(为此我将使用knuth shuffle)
  • 反转数据(很容易)
  • 几乎排序(不确定如何实现)
  • 很少有人(再一次不知道如何处理这个)

这个问题是为了生成一个近乎排序的列表。

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

4 个答案:

答案 0 :(得分:1)

要“排序”已排序的列表,使其“几乎排序”:

  1. 创建一个您可以想到的可应用于数组部分的函数列表,例如:

    Negate(array, startIndex, endIndex);
    Reverse(array, startIndex, endIndex);
    Swap(array, startIndex, endIndex);

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

    1. 随机选择2个整数*
    2. 从您想到的函数中随机选择一个函数
    3. 将该函数应用于数组的索引
  3. *注意:整数应该被限制为数组大小。相反,选择随机整数并围绕数组“换行” - 这样,靠近两端的元素将被修改为与中间元素相同的机会。

答案 1 :(得分:1)

在这里回答我自己的问题。所有这一切都是采用排序列表并对其中的一小部分进行调整。

    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;
    }

答案 2 :(得分:0)

几乎排序的列表是Timsort(python)在现实世界中如此高效的原因,因为数据通常是“几乎排序”的。有一篇关于它的文章解释了数据熵背后的数学。

答案 3 :(得分:0)

  1. 对数组进行排序。
  2. 开始按降序排序,并使用冒泡排序
  3. 经过几次迭代后停止(取决于您希望数组的“排序”数量
  4. 添加一些随机性(每当bubblesort想要交换两个元素投掷硬币并根据结果执行或不执行该操作,或使用不同于50/50的概率)
  5. 这将为您提供一个数组,该数组将在整个范围内大致相同地修改,保留大部分顺序(开始将保持最少元素,结束最大)。这是因为bubblesort随机测试所做的更改将是本地的。它不会同时混合整个阵列,以至于它与原始阵列不相似。

    如果你愿意,你也可以完全随机地随机洗牌阵列的整个部分(但保持部件不大,因为,你将完全放松顺序)。

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

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