簡體   English   中英

如何修復升序和降序排序?

[英]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所有引用分別替換為jj+1


通過在 for 循環的聲明部分用i定義j ,似乎您將ij相關聯以嘗試進行優化的冒泡排序; 也就是說,您試圖避免多余的比較。

您應該使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM