使用冒泡排序对销售团队进行排序

sorting a Salesteam using bubblesort

我需要以下程序的帮助:

我想做的是根据销售团队的销售量 (AntalSåldartiklar) 对销售团队进行排序。列表中的第一个是卖得最少的那个,最后是卖得最多的那个。其余的介于两者之间。是的,我需要使用 Bubblesort。一路上遇到了一些问题,但我想我已经解决了所有这些问题。我现在的问题是程序根本不对任何东西进行排序。请解释一下我如何修复它,就像我有点 child。在编程方面我完全是个新手

using System;
using System.IO;


namespace Inlämingsuppgift2ConsoleApplication
{
    class Program
    {
      struct Säljare : IComparable<Säljare>
        {
            public String Namn;
            public String Personnummer;
            public String Distrikt;
            public int AntalSåldaArtiklar;
            public int CompareTo(Säljare other)

            {
                  return AntalSåldaArtiklar - other.AntalSåldaArtiklar;
            }
          }


            [STAThread]

            static void Main(string[] args)
            {
                System.Console.Write("Hur många säljare vill du registrera?:");
                string antalSäljare = System.Console.ReadLine();
                System.Console.WriteLine("Registrera säljare:");
                int Antalsäljare = int.Parse(antalSäljare);

                Säljare[] säljare = new Säljare[Antalsäljare];

                int nivå1 = 0;
                int nivå2 = 0;
                int nivå3 = 0;
                int nivå4 = 0;

           void BubbleSort(Säljare[] list) where Säljare : IComparable<Säljare>

            {

                for (int i = 0; i < list.Length - 1; i++)
                {

                    for (int j = 1; j < list.Length - 1 - i; j++)
                    {
                        if (list[j].CompareTo(list[j - 1]) < 0)
                        {
                            Säljare tmp = list[j + 1];
                            list[j + 1] = list[j];
                            list[j] = tmp; 
                        }
                    }

                }
            }

            for (int i = 0; i < Antalsäljare; i++)

                {

                    System.Console.Write(" Ange Namn: ");
                    säljare[i].Namn = System.Console.ReadLine();
                    System.Console.Write(" Ange Personnummer: ");
                    säljare[i].Personnummer = System.Console.ReadLine();
                    System.Console.Write(" Ange Distrikt: ");
                    säljare[i].Distrikt = System.Console.ReadLine();
                    System.Console.Write(" Ange antal Artiklar: ");
                    säljare[i].AntalSåldaArtiklar = int.Parse(System.Console.ReadLine());
                    Console.WriteLine("\n");

                }

                for (int j = 0; j < Antalsäljare; j++)
                {

                    if (säljare[j].AntalSåldaArtiklar < 50)
                    {

                        nivå1++;
                    }

                    else if (säljare[j].AntalSåldaArtiklar >= 50 && säljare[j].AntalSåldaArtiklar < 100)
                    {

                        nivå2++;
                    }

                    else if (säljare[j].AntalSåldaArtiklar >= 100 && säljare[j].AntalSåldaArtiklar < 200)

                    {

                        nivå3++;
                    }

                    else if (säljare[j].AntalSåldaArtiklar > 200)
                    {

                        nivå4++;
                    }

                }

                BubbleSort(säljare);
                try
                {
                    StreamWriter sw = new StreamWriter("F:\Test.txt");

                    for (int i = 0; i < säljare.Length; i++)
                    {

                        Console.WriteLine("\n");
                        Console.WriteLine("Namn: " + säljare[i].Namn);
                        Console.WriteLine("Personnummer: " + säljare[i].Personnummer);
                        Console.WriteLine("Distrikt: " + säljare[i].Distrikt);
                        Console.WriteLine("Antal sälj: " + säljare[i].AntalSåldaArtiklar);

                        sw.WriteLine("\n");
                        sw.WriteLine("Namn: " + säljare[i].Namn);
                        sw.WriteLine("Personnummer: " + säljare[i].Personnummer);
                        sw.WriteLine("Distrikt: " + säljare[i].Distrikt);
                        sw.WriteLine("Antal sälj: " + säljare[i].AntalSåldaArtiklar);

                        sw.WriteLine("\n");
                        sw.WriteLine("-----------------------------");
                        sw.WriteLine("\n Antal Säljare på nivå 1: " + nivå1);
                        sw.WriteLine("Antal Säljare på nivå 2: " + nivå2);
                        sw.WriteLine("Antal Säljare på nivå 3: " + nivå3);
                        sw.WriteLine("Antal Säljare på nivå 4: " + nivå4);
                        sw.WriteLine("\n -----------------------------");

                        Console.WriteLine("\n");
                        Console.WriteLine("-----------------------------");
                        Console.WriteLine("\n Antal Säljare på nivå 1: " + nivå1);
                        Console.WriteLine("Antal Säljare på nivå 2: " + nivå2);
                        Console.WriteLine("Antal Säljare på nivå 3: " + nivå3);
                        Console.WriteLine("Antal Säljare på nivå 4: " + nivå4);
                        Console.WriteLine("\n -----------------------------");
                        sw.Flush();


                    }

                }

                catch (Exception e)
                {
                    Console.WriteLine("Exception: " + e.Message);
                }

                finally
                {
                    Console.WriteLine("Executing finally block.");
                }
            }
        }
    }

您的排序算法比较“当前与上一个”,然后交换“当前与下一个”——这是不一致的。如果你有一个数组 { 3, 1, 2 } 并且“当前”是 1(中间那个),你不能将 1 与 3(上一个)进行比较,然后以此为基础来决定 1 和 2(下一个)应该交换

if (list[j].CompareTo(list[j - 1]) < 0) //if "current" less than "previous"
{
    Säljare tmp = list[j + 1];  //remember next
    list[j + 1] = list[j];      //swap current into next
    list[j] = tmp;              //set current from memory
}

真的,你想要做“当前与下一个”,也许“交换当前和下一个”。因为我们正在比较当前和下一个,并且我们想要一个列表,其中最小的在前排序,如果当前 大于 接下来,我们想要执行交换。

for (int i = 0; i < list.Length - 1; i++)
{
    for (int j = 0; j < list.Length - 1 - i; j++) 
    {
        if (list[j].CompareTo(list[j + 1]) > 0)
        {
            Säljare tmp = list[j + 1];
            list[j + 1] = list[j];
            list[j] = tmp; 
        }
    }
}

请注意,我们已经更改了 j 循环的起点。 j 从当前的 0 开始,然后继续“小于(长度 - 1)”,这实际上意味着在 10 个元素的数组中 j 将 运行 从 0 到 8,因为它 运行s 到“小于长度小于一”。这意味着做 j+1 是安全的,因为它不会掉出数组

暂时保持 10 大小的数组,i 值一直在增加。当i为1时,j只有0到7的运行。我们不需要一直运行到8,因为不需要检查它。冒泡排序一路带着最小的项,第一次把它丢到slot 9(数组末尾),所以我们知道9已经是最小项了;我们不再需要交换它了。现在忘记它是一种优化.. 所以我们从 0 到 7 进行循环 运行,这意味着几乎最小的项目将一直运送到插槽 8 并丢弃在那里。重复直到数组排序

如果您想以另一种方式排序,即最大优先排序,您将“如果当前项小于下一项则交换元素”

只用整数玩一玩:https://dotnetfiddle.net/ldwOMV