[英]How to fix sort in ascending and descending order?
我有這個錯誤,我無法將選擇排序按正確的升序和降序排列。 我已經嘗試了所有可能的解決方案來解決這個問題,但我想不出別的辦法。 如果有人願意幫助我解決這個問題,我將不勝感激。
錯誤示例 -
我希望它變成什么樣——
排序方法
public static void Sort(Employee[] emp, int size, int choice) {
for (int i = 0; i < size - 1; i++) {
for (int j = i + 1; j < size - 1; j++) {
bool switchval = false;
switch (choice) {
case 1: // ascending sort by employee name
if (emp[j].GetName().CompareTo(emp[j + 1].GetName()) > 0)
switchval = true;
break;
case 2: // ascending sort by employee number
if (emp[j].GetNumber() > emp[j + 1].GetNumber())
switchval = true;
break;
case 3: // descending sort by hourly rate
if (emp[j].GetRate() < emp[j + 1].GetRate())
switchval = true;
break;
case 4: // descending sort by weekly hours
if (emp[j].GetHours() < emp[j + 1].GetHours())
switchval = true;
break;
case 5: // descending sort by gross pay
if (emp[j].GetGross() < emp[j + 1].GetGross())
switchval = true;
break;
}
if (switchval) {
Employee temp;
temp = emp[i];
emp[i] = emp[j];
emp[j] = temp;
}
}
}
}
您正在嘗試實現bubble sort
算法,但是您錯誤地迭代了數組。 首先,將內部 for 循環更改為:
for (int j = 0; j < size - 1; j++)
然后將 if 塊更改為:
if (switchval)
{
Employee temp;
temp = emp[j];
emp[j] = emp[j+1];
emp[j+1] = temp;
}
因為您想根據j
而不是i
執行此操作(因為i
用於迭代所有元素,而不是排序本身的一部分)。
擴展@Hayden 的回答(以及我對它的評論):您應該將switchVal
if 語句塊中對i
所有引用分別替換為j
和j+1
;
通過在 for 循環的聲明部分用i
定義j
,似乎您將i
與j
相關聯以嘗試進行優化的冒泡排序; 也就是說,您試圖避免多余的比較。
您應該使用i
來推導在 for 循環的條件部分(即max
)中與j
進行比較的值:
for (var j = 0; j < size - 1 - i; j++)
對於每個完整的j
迭代循環,元素emp[(size - 1 - i) - 1]
將位於正確的排序索引中。 任何與該元素相關的冗余比較都將被跳過。
此外,您應該檢查是否在每個完整的j
迭代循環中發生了交換,以處理列表已經排序的情況。
在以下代碼部分中,我定義了Employee[] employees
。 我將演示使用IOrderedEnumerable<T>.OrderBy<T, TKey>(Func<T, TKey>)
進行初始排序 - 並將結果分配給employeesSortedByNameDesc
。 然后我將反轉該數組並將其分配給變量reverseEmployees
; 最后,我將使用每個Employee[]
變量和更改后的Sort
方法。
概述和注意事項:
Sort()
對employees
Sort()
對employeesSortedByNameDesc
Sort()
在reversedEmployees
j
每次迭代都會有一個swap
j
迭代將導致一個項目被排序\\移到數組的末尾;Employee
類型public class Employee
{
internal string FirstName { get; set; }
internal string LastName { get; set; }
public string GetName() => $"{FirstName} {LastName}".Trim();
}
Sort()
方法(使用hasSwapOccurred
檢查條件break;
)static void Sort(Employee[] emp, int size, int choice)
{
for (int i = 0; i < size - 1; i++)
{
bool hasSwapOccurred = false;
for (int j = 0; j < size - 1 - i; j++)
{
bool switchval = false;
switch (choice)
{
case 1: // ascending sort by employee name
if (emp[j].GetName().CompareTo(emp[j + 1].GetName()) > 0)
switchval = true;
break;
default:
break;
}
if (switchval)
{
Employee temp;
temp = emp[j];
emp[j] = emp[j + 1];
emp[j + 1] = temp;
}
//Console.WriteLine($"(switchval := {switchval}, hasSwapOccurred := {hasSwapOccurred}) => [{string.Join(",", emp.Select(e => e.GetName()).ToArray()) }]");
}
//Console.WriteLine("-----");
if (!hasSwapOccurred)
break;
}
//Console.WriteLine("");
}
static void Main(string[] args)
{
var employees = new Employee[]
{
new Employee { FirstName = "Bruce", LastName = "Wayne"},
new Employee { FirstName = "Clark", LastName = "Kent"},
new Employee { FirstName = "Ronald", LastName = "Raymond"},
new Employee { FirstName = "Dinah", LastName = "Lance"},
new Employee { FirstName = "Arthur", LastName = "Curry"},
new Employee { FirstName = "Shayera", LastName = "Hol"}
};
var employeesSortedByNameDesc = employees.OrderBy(SelectEmployeeName).ToArray();
var reversedEmployees = employeesSortedByNameDesc.Reverse().ToArray();
Sort(employees, employees.Length, 1);
Sort(employeesSortedByNameDesc, employeesSortedByNameDesc.Length, 1);
Sort(reversedEmployees, reversedEmployees.Length, 1);
string SelectEmployeeName(Employee e) => e.GetName();
}
Console.Write
輸出(在上面的示例代碼中已注釋掉)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.