快速排序的代码及分析

快速排序的基本思想:通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。

快速排序的平均时间复杂度是O(nlogn),且它是一种不稳定的排序
快速排序使用分治法来把一个数组分为两个子数组。具体算法描述如下:
从数列中挑出一个元素,称为 “基准”(X);
重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区操作;
递归地把小于基准值元素的子数列和大于基准值元素的子数列排序。
在这里插入图片描述

/*快速排序的平均时间复杂度是O(nlogn),且它是一种不稳定的排序*/
    /// <summary>
    /// 快速排序
    /// </summary>
    /// <param name="array">要排序的数组</param>
    /// <param name="left">数组要排序部分的左端</param>
    /// <param name="right">数组要排序部分的右端</param>
        static void QuickSort(int[] array, int left, int right)
        {
             if (left < right)
            {
                int x = array[left];//选取一个数作为基准数,一般就选择数组中的第一个数作为基准数
                int i = left;//左边的指针(注意,这里的指针是单纯意义上的指针,不是数据结构里边那个指针)
                int j = right;//右边指针
                while (i < j)//当左右指针还没有相遇的时候
                {
                    while (i < j)//先从后面开始往前与前边的指针比较。 
                    {
                        if (array[j] <x)
                        {//如果遇到array[j]<x,把array[j]指向的数往array[i]这个坑里边填
                            array[i] = array[j];
                            break;//填完前边的坑后,后边array[j]的位置就有坑了,现在跳出此循环
                        }
                        else
                        {//没有比前边小,此时指针j往前移动指向下一个元素
                            j--;
                        }
                    }
                    while (i < j)//现在开始从前边往后边进行比较
                    {
                        if (array[i] >x)
                        {//如果遇到前边的array[i]的数比x大的情况,就把array[i]指向的数往array[j]这个坑里边填
                            array[j] = array[i];
                            break;// 填完前边的坑后,前边array[i]的位置就又有坑了,现在跳出此循环
                        }
                        else
                        {
                            i++;//否则i往前走,就这样,i和j彼此逐渐靠近
                        }
                    }
                }
                array[i] = x;//既然跳出最大的这个大循环了,说明i与j相遇了,此时这个共同的坑就是基准x应该要放入的地方
                QuickSort(array, left, i - 1);//对数组的前半部分按照这个方法进行排序
                QuickSort(array, i + 1, right);//对数组的后半部分按照这个方法进行排序,如此递归调用反复,最终能完成整个数组的排序
            }
        }
        static void Main(string[] args)
        {
            int[] array = new int[] { 42, 20, 17, 27, 13, 8, 17, 48 };
            QuickSort(array,0,array.Length-1);
            for (int i = 0; i < array.Length; i++)
            {
                Console.Write(array[i] + " ");
            }
            Console.ReadKey();
        }

``

以下是我的笔记,有详细的过程可以参考
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值