使用冒泡排序对销售团队进行排序
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
我需要以下程序的帮助:
我想做的是根据销售团队的销售量 (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