我创建了两个使用冒泡排序对列表进行排序的函数,但我想将排序样式更改为快速排序。
我找到了这种快速排序算法
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循环。
我不明白如何将这两个功能更改为使用快速排序。
有人可以帮帮我吗?
答案 0 :(得分:3)
您无需在.NET中自行编写 - 您可以使用:
List<string>
(确保您在课程顶部使用System.Linq)对于你想要的,最简单的入门方法是使用#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可能最简单。
答案 1 :(得分:2)
所以你有一个List<SPListItem>
并且你希望它们根据某些字段的数值使用有效的排序算法(也就是不是bubblesort)进行排序。这很容易,并且不涉及您重新实施快速排序。
List<SPListItem> list = ...;
var sortedData = list.OrderBy(item => Convert.ToInt32(item["fieldName"]));
值得注意的是,在可能的情况下,通常最好对数据库中的数据进行排序,而不是在Web服务器上。您应该能够在生成Order By
的CAML查询中添加SPListItem
子句并让它进行排序。
您似乎正在排序两个不同的“并行”数据结构(两个结构的相同索引处的项目“属于”在一起)。这通常是不合需要的。虽然有两种方法可以对两种结构进行排序,但您真正应该做的是制作一个单独的结构,使每个项目保留在逻辑上代表该项目的所有内容上。在许多情况下,这意味着创建一个新的class
,其中包含每个数据的属性。然后,您可以填充此新复合类的集合并对其进行排序。