C# list 拓展方法:排序插入

查找位置的时间是O(log2n),插入时间为O(n)

用add再用sort方法的平均耗时为O(nlog2n),最坏的情况为O(N^2)(来自MSDN),所以用我的拓展方法可以高效的完成插入并排序的操作(其实很简单的,笑)

不保存重复项只是因为在我的使用当中要求的,想要保存重复项只要删掉两行代码就可以了


    public static class MySortList
    {
        /// <summary>
        /// 按照排序保存,不保存重复项
        /// </summary>
        /// <typeparam name="T">要实现IComparable<T>的类型参数</typeparam>
        /// <param name="inData">要添加的数据</param>
        public static void SortAdd<T>(this List<T> data, T inData)
            where T :IComparable<T>
        {
            if (data.Count != 0)
            {
                int start = 0;
                int end = data.Count - 1;
                while (true)
                {
                    //当开始指针和末尾指针中间没有另一个数据的时候,就可以计算要插入的位置
                    if (end -start<=1)
                    {
                        //比data[start]要小就保存在start位置,比data[end]大就保存在end+1位置
                        //否则就插在end位置
                        int resS = inData.CompareTo(data[start]);
                        int resE = inData.CompareTo(data[end]);
                        if (resE == 0 || resS == 0) break;
                        if (resS< 0)
                            data.Insert(start, inData);
                        else if (resE> 0)
                            data.Insert(end + 1, inData);
                        else
                            data.Insert(end, inData);
                        break;
                    }
                    //二分法,比较一下中间值,然后调整start和end指针
                    int mid = (start + end) / 2;
                    int result =inData.CompareTo(data[mid]);
                    if (result > 0)
                        start = mid;
                    else
                        end = mid;
                }
            }
            else//当data中没有数据的时候直接加入data当中
                data.Add(inData);
        }
    }
   

最后,一个缺点就是默认插入的列表是已经排序好的

有BUG随时可以留言嘲讽( •̀ ω •́ )y

你可能感兴趣的:(C#,sort,插入,List,拓展方法)