简单的算法学习

namespace ConsoleApp
{
    static class Program
    {

        static void Main(string[] args)
        {
            int[] ss = new int[] { 7, 2, 8, 3, 4, 1, 11, 9, 234, 72, 5 };
            KSPX(ss, 0, ss.Length - 1);
            Console.ReadKey();
        }

        /// <summary>
        /// 快速排序
        /// </summary>
        /// <param name="ss"></param>
        /// <param name="left_ys"></param>
        /// <param name="right_ys"></param>
        private static void KSPX(int[] ss, int left_ys, int right_ys)
        {
            if (right_ys - left_ys > 0) //跳出递归
            {
                var left = left_ys;   //获得位置,因为left是要变动的,所以不能直接用left_ys
                var right = right_ys;

                var x = ss[left++];  //记录第一个数据,然后移动下标,跳过第一个数据

                while (left < right) //没相撞的情况下
                {
                    while (ss[right] > x && left < right) //从右向左逐个查找,大于就跳过,小于就跳出循环
                    {
                        right--;
                    }
                    while (ss[left] < x && left < right) //从左往右找小于的
                    {
                        left++;
                    }
                    if (left < right) //可能经过上面的操作left>=right,所以这里要判断下
                    {
                        //将找到的2个数值进行替换
                        var tmp = ss[left];
                        ss[left] = ss[right];
                        ss[right] = tmp;
                        //替换后移动下标
                        left++;
                        right--;
                    }
                }
                if (ss[left_ys] > ss[left]) //检查完毕后,将基准值和最后left(小于)下标指向的数据进行替换,前提是基准值大于left(可能会出现小于的现象——基准值本来就是最小的)
                {
                    ss[left_ys] = ss[left];
                    ss[left] = x;
                }
                KSPX(ss, left_ys, left - 1); //递归右半部份
                KSPX(ss, left + 1, right_ys); //递归左半部分
            }
        }

        /// <summary>
        /// 选择排序
        /// </summary>
        /// <param name="ss"></param>
        private static void XZPX(int[] ss)
        {
            for (int i = 0; i < ss.Length; i++)
            {
                var index = i;
                for (int j = (i + 1); j < ss.Length; j++)
                {
                    if (ss[index] > ss[j])
                    {
                        index = j;
                    }
                }
                var tmp = ss[i];
                ss[i] = ss[index];
                ss[index] = tmp;
            }
        }

        /// <summary>
        /// 冒泡排序
        /// </summary>
        /// <param name="ss"></param>
        private static void MPPX(int[] ss)
        {
            for (int i = 0; i < ss.Length; i++)
            {
                for (int j = 0; j < ss.Length - 1 - i; j++)
                {
                    if (ss[j] > ss[j + 1])
                    {
                        var tmp = ss[j];
                        ss[j] = ss[j + 1];
                        ss[j + 1] = tmp;
                    }
                }
            }
        }

    }

}

 

posted @ 2016-08-17 15:35  WmW  阅读(244)  评论(0编辑  收藏  举报