0

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

我发现了这个快速排序算法

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 循环中。

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

有人可以帮帮我吗?

4

2 回答 2

3

您无需在 .NET 中自己编写 - 您可以使用:

  1. Array.Sort用于基本项目数组
  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 种不同的方法可以使用可比较的接口(更多信息here)。由于您无法更改 SPListItem 类,因此 Sort 或 LINQ 可能最简单。

于 2012-08-23T19:19:39.917 回答
2

所以你有一个List<SPListItem>并且你希望它们排序,使用基于某个字段的数值的有效排序算法(又名不是冒泡排序)。这很容易,并且不需要您重新实现快速排序。

List<SPListItem> list = ...;

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

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

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

于 2012-08-23T19:22:13.147 回答