内排序-快速排序

Posted mytrip

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内排序-快速排序相关的知识,希望对你有一定的参考价值。

算法思想:通过一趟排序将待排序列分割成独立的两部分,其中一部分均比另外一部分小,则可对这两部分继续继续排序,重复之前步骤,以达到整个序列有序的目的.它是由图灵获得者 Tony Hoare设计出来的,该算法被列为20世纪十大算法之一.

 

 //寻找关键值的位置,最后一次性移过去
    class QuickSort_1
    {
        static void Main(string[] args)
        {
            int[] a = new int[] { 20, 30, 90, 40, 70, 110, 60, 10, 100, 50, 80,9,8,7,6 };
       
            QuickSort_1 quickSort = new QuickSort_1();
            quickSort.Sort(a, 0, a.Length - 1);
            foreach (int i in a)
            {
                Console.WriteLine(i);
            }
            Console.ReadLine();
        }
        /// <summary>
        /// 交换数据
        /// </summary>
        /// <param name="datas"></param>
        /// <param name="index1"></param>
        /// <param name="index2"></param>
        void ExchangeData(int[] datas, int index1, int index2)
        {
            if (index1 < 0 || index2 < 0 || index1 >= datas.Length || index2 >= datas.Length)
            {
                return;
            }          
            datas[index1] = datas[index2] + (datas[index2] = datas[index1]) * 0;
        }
        public void Sort(int[] arrays, int left_index, int right_index)
        {
            if (left_index == right_index) return;
            int important = left_index;//关键值
            int cur_left = left_index;//左游标
            int cur_right = right_index;//右游标
           
            while (cur_left < cur_right)//当左右游标未相遇时
            {
                while (arrays[cur_right] >= arrays[important] && cur_left < cur_right)
                {
                    cur_right--;//先从右游标开始 ,递减遇到小于关键元素的值
                }
                while (arrays[cur_left] <= arrays[important] && cur_left < cur_right)
                {
                    cur_left++;//再从左游标开始 ,递减遇到大于关键元素的值
                }
                if (cur_left <cur_right && arrays[cur_left] > arrays[cur_right])
                {
                    ExchangeData(arrays, cur_left, cur_right);//当游标未相遇时,并且前值大于后值时,交换这两个游标指向的值
                }
            }
            if (cur_left == cur_right )
            {//当游标相遇时
                ExchangeData(arrays, important, cur_right);//把关键值交换到相遇位置
                important = cur_left;
                Sort(arrays, left_index, important - 1);// 将关键值左边的序列 重复以上过程
                Sort(arrays, important + 1, right_index);//将关键值右边的序列 重复以上过程
            }
        }
    }

 

以上是关于内排序-快速排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法—— 希尔排序快速排序

内排序方法的比较

冒泡快速归并排序

Java实现快速排序

轻松学习快速排序(二 )-- 快速排序优化

排序算法之快速排序