C# 快速排序算法存在问题



>我创建了两个使用气泡排序对列表进行排序的函数,但我想将排序样式更改为快速排序。

我找到了这个快速排序算法

http://snipd.net/quicksort-in-c

这是我的两个功能:

    protected void sort_by_section_name()
    {
        int num1, num2;
        for (var i = section_names.Count - 1; i > 0; i -= 1)
        {
            for (var j = 0; j < i; j += 1)
            {
                num1 = get_number_from_section(section_names[j]);
                num2 = get_number_from_section(section_names[j + 1]);
                if (num1 > num2)
                {
                    swap_list_strings(section_names, j, j + 1);
                    swap_object_items(item_group_list, j, j + 1);
                }
            }
        }
    }
    protected void sort_items()
    {
        int num1, num2;
        List<SPListItem> temp;
        for (var k = 0; k < item_group_list.Count; k += 1)
        {
            temp = (List<SPListItem>)item_group_list[k];
            for (var i = temp.Count - 1; i > 0; i -= 1)
            {
                for (var j = 0; j < i; j += 1)
                {
                    num1 = Convert.ToInt32((temp[j])[ORDER_BY_COLUMN]);
                    num2 = Convert.ToInt32((temp[j + 1])[ORDER_BY_COLUMN]);
                    if (num1 > num2)
                    {
                        swap_list_items(temp, j, j + 1);
                    }
                }
            }
        }
    }

对于sort_items,它是一个数组数组,所以气泡排序的东西在 for 循环中。

我不明白如何将这两个函数更改为使用快速排序。

有人可以帮我吗?

你不需要自己在 .NET 中编写它 - 你可以使用:

  1. Array.排序的基本项目数组
  2. LINQ - OrderBy 例如带有List<string>(确保在类的顶部使用 System.Linq(
  3. 如果您喜欢冒险,请查看 IComparable
  4. 使用 myItems.Sort(( 对它们进行就地排序。

对于您想要的,最简单的入门方法是使用 #2,下面是一个示例:

List<SPListItem> myItems = GetSomeItems();
myItems = myItems.OrderBy(i => i["MyField"]).ToList();
foreach (var item in sortedItems)
    Console.WriteLine(item);

不知道你所追求的字段,或者关于 SharePoint 对象的很多猜测,在具有类似接口的 .NET 中大约有 5 种不同的方法可以做到这一点(此处提供了更多信息(。由于您无法更改 SPListItem 类,因此 Sort 或 LINQ 可能是最简单的。

因此,

您有一个List<SPListItem>,并且希望使用基于某个字段的数值的有效排序算法(也称为非气泡排序(对它们进行排序。 这很容易,并且不涉及重新实现快速排序。

List<SPListItem> list = ...;
var sortedData = list.OrderBy(item => Convert.ToInt32(item["fieldName"]));

还值得注意的是,如果可能的话,通常最好在数据库而不是网络服务器上对数据进行排序。 您应该能够将Order By子句添加到生成这些SPListItem的 CAML 查询中,并让它执行排序。

您似乎正在对两个"并行"的不同数据结构进行排序(两个结构的同一索引处的项目"属于"在一起(。 这通常是不可取的。 虽然有一些方法可以对这两个结构执行排序,但您真正应该做的是创建一个结构,以便每个项目都保留逻辑上表示该项目的所有内容。 在许多情况下,这意味着创建一个具有每条数据的属性的新class。 然后,可以填充此新复合类的集合并对其进行排序。

最新更新