C# 插入排序、选择排序、冒泡排序

排序可以说是笔试题经常出现的一道简单算法题了,主要考察程序员的基本功和是否科班出身。这里用c# 简单实现了三种排序算法。

一、插入排序

插入排序的基本思想是:每步将一个待排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止。

  
        调用方式
       List<int> y = InsertionSort<int>(i, (a, b) => { return a < b; });
       int[] z = InsertionSort<int>(m, (a, b) => { return a < b; });
       #region 插入排序
        public List<T> InsertionSort<T>(List<T> list, Func<T, T, bool> comparer)
        {
            for (int i = 1, j = list.Count; i < j; i++)
            {
                int m = i-1;
                T temp = list[i];//保存当前的元素
                while (m >= 0 && comparer(list[m], temp))
                {
                        list[m + 1] = list[m];
                        m--;
                }
                list[m+1] = temp;
            }
            return list;
        }
        public T[] InsertionSort<T>(T[] list, Func<T, T, bool> comparer)
        {
            for (int i = 1, j = list.Length; i < j; i++)
            {
                int m = i - 1;
                T temp = list[i];//保存当前的元素
                while (m >= 0 && comparer(list[m], temp))
                {
                    list[m + 1] = list[m];
                    m--;
                }
                list[m + 1] = temp;
            }
            return list;
        }
       #endregion

二、选择排序

工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。

        //选择排序
        List<int> k = SelectionSort<int>(i, (a, b) => { return a < b; });
        int[] x = SelectionSort<int>(m, (a, b) => { return a < b; });
        #region 选择排序
        public List<T> SelectionSort<T>(List<T> list, Func<T, T, bool> comparer)
        {
            if (list == null || list.Count <= 0) return list;
            for (int i = 0, j = list.Count - 1; i < j; i++)
            {
                int k = i;
                for (int m = i + 1, n = j + 1; m < n; m++)
                {
                    if (comparer(list[k], list[m]))
                    {
                        k = m;
                    }
                }
                T temp = list[i];
                list[i] = list[k];
                list[k] = temp;
            }
            return list;
        }

        public T[] SelectionSort<T>(T[] list, Func<T, T, bool> comparer)
        {
            if (list == null || list.Length <= 0) return list;
            for (int i = 0, j = list.Length - 1; i < j; i++)
            {
                int k = i;
                for (int m = i + 1, n = j + 1; m < n; m++)
                {
                    if (comparer(list[k], list[m]))
                    {
                        k = m;
                    }
                }
                T temp = list[i];
                list[i] = list[k];
                list[k] = temp;
            }
            return list;
        }
        #endregion

三、冒泡排序

冒泡排序算法的原理如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

  3. 针对所有的元素重复以上的步骤,除了最后一个。

  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

        List<int> j = BubbleSort<int>(i, (a, b) => { return a < b; });
        int[] n = BubbleSort<int>(m, (a, b) => { return a < b; });

        public List<T> BubbleSort<T>(List<T> list, Func<T, T, bool> comparer)
        {
            if (list == null || list.Count <= 0) return list;

            for (int i = 0, j = list.Count - 1; i < j; i++)
            {
                for (int m = i + 1, n = j + 1; m < n; m++)
                {
                    if (comparer(list[i], list[m]))
                    {
                        T temp1 = list[i];
                        list[i] = list[m];
                        list[m] = temp1;
                    }
                }
            }
            return list;
        }
        /// <summary>
        /// 数组冒泡排序
        /// </summary>
        /// <typeparam name="T">类型</typeparam>
        /// <param name="list">数组</param>
        /// <param name="comparer">用于比较的委托</param>
        /// <returns></returns>
        public T[] BubbleSort<T>(T[] list, Func<T, T, bool> comparer)
        {
            if (list == null || list.Length <= 0) return list;

            for (int i = 0, j = list.Length - 1; i < j; i++)
            {
                for (int m = i + 1, n = j + 1; m < n; m++)
                {
                    if (comparer(list[i], list[m]))
                    {
                        T temp1 = list[i];
                        list[i] = list[m];
                        list[m] = temp1;
                    }
                }
            }
            return list;
        }
发布了65 篇原创文章 · 获赞 28 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_26900081/article/details/88533468
今日推荐