快速排序--算法

本文详细介绍了快速排序算法,一种对冒泡排序的改进方法。通过一趟排序将数据分割成独立的两部分,每部分再进行递归排序,实现高效排序。文章提供了具体的实现代码和运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们应该了解快速排序是对冒泡排序的一种改进。

它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再对这两个部分分别进行快速排序,可以看出这是一个递归的过程。

快速排序的流程:

1、首先确定一个分界值,通过该分界值将数组分成左右两部分。(分界值一般选择排序部分的第一个元素)

2、将大于等于分界值的元素放在数组右边,小于分界值的元素放在数据左边。经过此操作后右边的元素都大于等于分界值,左边的元素都小于或等于分界值。

3、左边和右边的数据可以进行独立的快速排序。对于左侧的数据重复1、2步骤,对于右侧的数据重复1、2步骤。

4、重复上述过程,可以看出这是一个递归的过程。

下面给出一个实现方式,其中有详细的解释:

 private void Sort(int[] array, int low, int high) {
            if (low >= high) return;

            Console.WriteLine("首先完成一次单元排序");
            int index = SortUnit(array, low, high);
            Console.WriteLine("对左边单元进行排序");
            Sort(array, low, index - 1);    //对左边单元进行排序
            Console.WriteLine("对右边单元进行排序");
            Sort(array, index + 1, high);   //对右边单元进行排序
        }



 /// <summary>
        /// 一次单元排序
        /// </summary>
        /// <param name="array">数组</param>
        /// <param name="low">排序的起始位置</param>
        /// <param name="high">排序的结束位置</param>
        /// <returns>数组排序后的分界下标</returns>
        private  int SortUnit(int[] array,int low,int high)
        {
            //以第一个元素(即本次序列的第一个元素,本次序列指数组下标从low到high的所有元素的序列)作为分界值
            int flagValue = array[low]; 
            while (low<high)
            {
                while (array[high]>=flagValue && low<high)  //(在本次序列中)从后向前搜索比分界值小的元素
                {
                    high--;
                }
                array[low] = array[high];   //比分界值小的元素放在左边
                while (array[low]<=flagValue &&low<high)    //(在本次序列中)从前往后搜索比分界值大的元素
                {
                    low++;
                }
                array[high] = array[low];   //比分界值大的元素放在右边
            }

            //经过上面的while循环此时low==high
            //此时左边都比flagValue小,右边都比flagValue大
            array[low] = flagValue;
            Console.WriteLine("low={0},high={1},flagValue={2}", low, high, flagValue);
            foreach (var item in array)
            {
                Console.Write("{0}\t",item);
            }
            Console.WriteLine();
            return high;
        }

 public void QuickSortTest() {
            int[] array = { 49, 38, 65, 97, 76, 13, 27 };
            Console.WriteLine("排序前的数据:\t");
            foreach (var item in array)
            {
                Console.Write("{0}\t", item);
            }
            Sort(array, 0, array.Length - 1);
            Console.WriteLine("排序后的数据:\t");
            foreach (var item in array)
            {
                Console.Write("{0}\t", item);
            }
            Console.ReadLine();
        }

运行结果如下:

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值