如何在不使用任何C#方法的情况下在C#中对字符串数组进行排序?

时间:2017-07-04 23:16:49

标签: c#

我想对这个字符串数组进行排序:

string[] array = new string[10]{ "Taha", "Usama", "Ali" }

结果应为(Ali, Taha, Usama)

string [] Name = new string[30];
for (int i = 0; i < 5; i++)
{
    Console.WriteLine("Enter The Name :");
    Name[i] = Console.ReadLine();
}

这是我为实现项目所做的基本逻辑:

// login of sorting string array[]
string name = string.Empty;
Console.WriteLine("Sorted Strings : ");

for (int i = 0; i < Name.Length; i++)
{
    int c = 0;
    for (int j = 1; j < Name.Length; j++)
    {
        if (j > i)
        {
            Sort:
            if (Name[i][c] > Name[j][c])
            {
                name = Name[i];
                Name[i] = Name[j];
                Name[j] = name;
            }
            else
            {
                c = c + 1;
                goto Sort;
            }
        }
    }
    Console.WriteLine(Name[i]);
}

3 个答案:

答案 0 :(得分:1)

乍一看,你的代码看起来好像没有正确处理案例(Name [i] [c]&lt; Name [j] [c])的问题,因为它落入其他地方c得到增加。然后我意识到还有更多的问题所以我从头开始并为自己设定了相同的任务,即从没有技巧的第一原则中分类。我想出的是:

在主要功能中:

    List<string> Names = new List<string>() { "Taha", "Usama", "Ali", "Taylor", "Swift" };
    List<string>Sorted = SortText(Names);

然后是两个子功能:

private List <string> SortText(List<string> Names)
{
    List<int> order = new List<int>();
    List<bool> found = new List<bool>();
    for (int i = 0; i < Names.Count; i++)
    {
        order.Add(0);
        found.Add(false);
    }

    for (int i = 0; i < Names.Count - 1; i++)
    {
        string test = Names[i];
        int pos = 0;
        for (int j = 0; j < Names.Count; j++)
        {
            if (i == j)
            {
                continue;
            }
            string comp = Names[j];
            pos += isHigher(test, comp);
        }
        while (found[pos] == true)
        {
            pos++;
        }
        order[i] = pos;
        found[pos] = true;
    }
    //last one is the position missing in found
    for (int i = 0; i < Names.Count; i++)
    {
        if (!found[i])
        {
            order[Names.Count - 1] = i;
        } 
    }
    List<string> sorted = new List<string>();
    for (int i = 0; i < Names.Count; i++)
    {
        for (int j = 0; j < Names.Count; j++)
        {
            if (order[j] == i)
            {
                sorted.Add(Names[j]);
                break;
            }
        }
    }
    return sorted;
}

private int isHigher(string test, string comp)
{
    char[] arTest = test.ToArray();
    char[] arComp = comp.ToArray();

    for (int i = 0; i < arTest.Length; i++)
    {
        if (i == arComp.Length)
        {
            return 1;
        }
        if (arTest[i] > arComp[i])
        {
            return 1;
        }
        else if (arTest[i] < arComp[i])
        {
            return 0;
        }
    }
    return 0;
}

一些解释。首先我使用列表而不是数组。这是因为c#中的限制无法动态调整数组大小。使用列表意味着代码适用于任何长度列表。

其次,我实际上并没有移动任何元素,我只是构建一个索引,显示每个元素的最终结果。我通过计算列表中按字母顺序排列的其他单词的数量来实现此目的。给定基于0的索引,该位置只是先前单词的数量。

第三,我允许出现两次(或更多)的单词。如果两个单词之前的单词数相同,则它们是相同的,所以我只是增加后续出现的位置。这是找到的布尔列表的功能之一。

找到的另一个功能在最后。最后一个元素不需要进行比较,因为所有其他元素都与它进行了比较,因此它在顺序中的位置只是尚未分配的一个位置,即找到的一个元素仍然是假的。 / p>

最后,它总是有助于逻辑,将代码分割成子例程。这里重要的子例程是isHigher,它返回0或1,具体取决于第一个单词是在第二个单词之前还是之后,按字母顺序排列(如果它们相同则返回0)。

希望这有帮助。

对于不区分大小写的PS,您可以将isHigher的开头更改为

char[] arTest = test.ToLower().ToArray();
char[] arComp = comp.ToLower().ToArray();

答案 1 :(得分:0)

为什么不使用Linq;类似的东西:

var sortedName = Name.OrderBy(i => i).ToArray();

答案 2 :(得分:0)

     // This Mehod Definately work for u

 string[] arr = new string[3] { "Taha", "Usama", "Alias" };

                for (int i = 0; i < arr.Length - 1; i++)
                {
                    for (int j = i + 1; j < arr.Length; j++)
                    {
                        int lth = arr[i].Length < arr[j].Length ? arr[i].Length : arr[j].Length;
                        for (int k = 0; k < lth; k++)
                        {
                            if (arr[i][k] > arr[j][k])
                            {
                                string temp = arr[i];
                                arr[i] = arr[j];
                                arr[j] = temp;
                                break;
                            }
                            else if (arr[i][k] < arr[j][k])
                            {
                                break;
                            }
                        }
                    }
                }

// Display Result by Following Code

                foreach (string s in arr)
                {
                    Console.WriteLine(s);
                }