你能说出这种排序算法吗?

时间:2016-03-04 14:03:48

标签: c# sorting

我对C#有基本的了解,我读了一些关于排序算法的内容,但我还没有能够识别出这个。 我在C#中编写它,程序将字符串列表作为输入并按排序顺序输出。 如果您可以命名此算法,请执行此操作。

List<string> inputStrings = new List<string>();
string currentString = "";
Console.WriteLine("Enter strings and when you want to stop type '$$$'.");
while (currentString != "$$$")
{
    currentString = Console.ReadLine();
    if (currentString != "$$$")
        inputStrings.Add(currentString);
}
for (int i = 0; i < inputStrings.Count - 1; i++)
{
    for (int k = i + 1; k < inputStrings.Count; k++)
    {
        if (inputStrings[i].CompareTo(inputStrings[k]) > 0)
        {
            string tempString = inputStrings[i];
            inputStrings[i] = inputStrings[k];
            inputStrings[k] = tempString;
        }
    }
}
Console.WriteLine("These are the strings shown in sorted order:");
for (int i = 0; i < inputStrings.Count; i++)
{
    Console.WriteLine(inputStrings[i]);
}

3 个答案:

答案 0 :(得分:3)

这是Selection Sort

  

算法将输入列表分为两部分:已排序的项目子列表,在列表的前面(左侧)从左到右构建,以及剩余要排序的项目的子列表占用列表的其余部分。最初,排序的子列表为空,未排序的子列表是整个输入列表。该算法通过查找未排序子列表中的最小(或最大,取决于排序顺序)元素,与最左边的未排序元素(将其按排序顺序)交换(交换),并将子列表边界向右移动一个元素来继续

i的值表示已排序的数组部分与需要排序的部分之间的边界。

这种实现是非正统的,因为它会立即交换值,而不是等待嵌套循环完成。但是,选择排序的特征部分,即在未排序部分中线性搜索下一个更大的值,在此实现中存在。

这将对性能产生负面影响,因为交换的总数将从O(n)增加到O(n 2 )。

要了解为什么会发生这种情况,请考虑此算法的最坏情况,即数组按相反顺序排序。当发生这种情况时,每次迭代都将“移动”#34;数组的剩余部分由一个元素组成(|标记表示已排序/未排序的边界):

| a b c d -- first iteration of the outer loop
    b a c d -- nested loop starts
    c a b d
    d a b c -- nested loop finishes
d | a b c -- second iteration of the outer loop
    d b a c
    d c a b
d c | a b -- third iteration of the outer loop
    d c b a
d c b | a -- final state 

答案 1 :(得分:1)

它被称为冒泡排序。

您可以使用Optimized Bubble Sort对其进行优化。

另外,我不想使用$$$来结束你的输入。为什么不简单地要求在一行上输入所有字符串,每个字符串之间都有逗号。然后,您可以在Comma上拆分一个输入字符串,从而生成一个子字符串列表。

答案 2 :(得分:1)

它看起来像Selection sortBubble sort之间的混合。与选择排序类似,在i的每次迭代结束时,将对第i个元素进行排序。但是,与选择排序不同,它不会查找最大剩余值,而是在找到更大的值时立即交换,这就是冒泡排序的作用。

我认为这个确切的算法没有名称。