c#排序

快速排序

    **通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。**
namespace Sort
{
    class Program
    {
        static void Main(string[] args)
        {
            string result = string.Empty;
            int[] unsort = { 3, 2, 4, 1, 7, 5 };

            result = GetPrint(unsort);
            Console.Write("排序前结果: ");
            Console.WriteLine(result);

            //快速排序
            QuickSort(unsort, 0, unsort.Length - 1);

            result = GetPrint(unsort);
            Console.Write("排序后结果: ");
            Console.WriteLine(result);

            Console.ReadLine();
        }

        /// <summary>
        /// 调用快速排序算法
        /// </summary>
        /// <param name="unsort">待排序的整形数组</param>
        /// <param name="left">左边起始点</param>
        /// <param name="right">右边结束点</param>
        public static void QuickSort(int[] unsort, int left, int right)
        {
            if (left < right)
            {
                //获取一次排序的中间索引位置
                int midPosition = GetSplitNum(unsort, left, right);

                //递归实现
                QuickSort(unsort, left, midPosition - 1);
                QuickSort(unsort, midPosition + 1, right);
            }
        }

        /// <summary>
        /// 获取一次排序的中间索引位置
        /// </summary>
        /// <param name="unsort">待排序的整形数组</param>
        /// <param name="left">左边起始点</param>
        /// <param name="right">右边结束点</param>
        public static int GetSplitNum(int[] unsort, int left, int right)
        {
            int splitNum = unsort[left];
            while (left < right)
            {
                /**
                 * 从右端开始比较
                 * (1)假如从右端过来的数比分隔数要大,则不用处理
                 * (2)假如从右端过来的数比分隔数要小,则需要挪到分隔线左边
                 * */
                while (left < right && splitNum <= unsort[right])
                {
                    right--;
                }
                unsort[left] = unsort[right];

                /**
                 * 从从端开始比较
                 * (1)假如从左端过来的数比分隔数要小,则不用处理
                 * (2)假如从左端过来的数比分隔数要大,则需要挪到分隔线右边
                 * */
                while (left < right && splitNum >= unsort[left])
                {
                    left++;
                }
                unsort[right] = unsort[left];
            }
            //一趟比较之后,分隔数的位置就可以确认起来
            unsort[left] = splitNum;

            return left;
        }

        /// <summary>
        /// 打印输出结果
        /// </summary>
        /// <param name="unsort">数据</param>
        public static string GetPrint(int[] unsort)
        {
            string result = string.Empty;
            foreach (int n in unsort)
            {
                if (!string.IsNullOrEmpty(result))
                {
                    result += string.Format("->{0}", n);
                }
                else
                {
                    result = string.Format("{0}", n);
                }
            }
            return result;
        }
    }
}

results matching ""

    No results matching ""