c#快速排序算法问题

时间:2012-08-23 19:01:22

标签: c# sharepoint sorting

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

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

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

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

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:3)

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

  1. Array.Sort表示基本的项目数组
  2. LINQ - OrderBy例如List<string>(确保您在课程顶部使用System.Linq)
  3. 如果您有冒险精神,请查看IComparable
  4. 使用myItems.Sort()对其进行排序。
  5. 对于你想要的,最简单的入门方法是使用#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,其中包含每个数据的属性。然后,您可以填充此新复合类的集合并对其进行排序。