快快快,快速排序

一. 快速排序基础思想

快速排序的基础思想, 在一组无序的队列中选取一个基准数作为参考,把小于基准数的元素放在左(右)边,把大于基准数的元素放在右(左)边。无序的队列分成了两个部分,一部分是小于基准数的,一部分是大于基准数的,再对这两个部分进行同样的操作,以此类推,直到无序队列变成有序的队列。

二. 快速排序核心逻辑

1.从[ 53742 ]队列中选择一个基准数5,以升序进行排序。a表示左边开始的位置下标,位置表示[ a0,a1,a2,a3,a4 ],b表示右边的位置下标,位置表示为[ b0,b1,b2,b3,b4 ]

2. 在无序队列中选择第一个元素作为基准数,并把位置记为p1

3. 从b4开始检索,25小,记录位置索引b4

4.从a0开始检索,比5还大的是7,记录位置索引a2

5.交换b4与a2对应的元素,得到的队列为[ 5324

 6.从记录位置索引b4继续开始检索,选择比5小的元素,b3为4小于5,记录位置索引b3

 7.从记录位置索引a2继续开始检索,选择比5大的元素,a3为4不大于5,此时a3与记录位置b3同个位置,说明在该位置已经把队列分为两个部分,记为o1,得到的队列为[ 5324]

8.把p1的元素与o1的元素交换,得到的队列为[ 43257 ] ,包含两个部分,比5小的[ 432 ]与比5大的[ 7 ]

9.对其中的 [ 432 ]与[ 7 ]重新按照1到8步骤执行,最终得到的有序队列为[ 23457]

三. 快速排序图示

四. 快速排序代码

 

            int[] tempArrays = new[] { 5,3,7,4,2 };                //无序队列元素
            QuickSort(0, tempArrays.Length - 1, tempArrays);       //快速排序方法调用 

 

       /// <summary>
        /// 快速排序
        /// </summary>
        /// <param name="startIndex">开始位置</param>
        /// <param name="endIndex">结束位置</param>
        /// <param name="arrays">元素队列</param>
        public static void QuickSort(int startIndex, int endIndex, int[] arrays)
        {
            if (startIndex >= endIndex) return;   //查询终止条件
            int temp = arrays[startIndex];        //取得基准数
            int i = startIndex;                   //记录开始下标
            int j = endIndex;                     //记录结束下标
            while (i != j)                        
            {        
                while (arrays[j] >=temp && i < j) //查询比基准数小或等于的数
                {
                    j--;                          //下标减小
      
                }
                while (arrays[i] <= temp && i < j) //查询比基准数大或等于的数
                {
                    i++;                           //下标增大
          
                }
                if (i < j)                         //交换它们的位置
                {
                    int numTemp = arrays[i];
                    arrays[i] = arrays[j];
                    arrays[j] = numTemp;
                }
            }
            arrays[startIndex] = arrays[i];       //说明下标已经处于同个位置,把下标指明的位置的元素跟基准数处于的位置元素交换
            arrays[i] = temp;                     //基准数以把队列分为两个部分,左边比基准数小的,右边比基准数大的
            QuickSort(startIndex, i - 1, arrays); //对左边的队列进行同样的操作
            QuickSort(i + 1, endIndex, arrays); //对右边的队列进行同样的操作
        }

 

 五. 快速排序复杂度

1.在理想状况下,每一次都将待排序数组划分成等长两个部分,则需要logn次划分,时间复杂度为O(nlogn)

2.在最坏的情况下,即数组已经有序或大致有序的情况下,每次划分只能减少一个元素,时间复杂度为O(n^2)

3.总结,天下难事,必作于易 天下大事 必作于细。文章的总体介绍已经达到我目前的要求,也有不足之处,请指出,我会不间断的更新文章。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晨守星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值