菜鸟成长日记之交换排序之——快速排序(C#)

以前上课就听老师讲过快速排序在面试过程中很重要,尽管接触计算机的时间不长,但现在感觉对代码已经有了一种特殊的感情。写算法就要分析它的时间复杂度,空间复杂度(但我高等数学就没好好思考过,不是没学,是没好好思考怎么学,不过现在我改变了,知道怎么学了),说实话,以前老师将快排的时候似乎懂得,但自己从来没有好好亲身实践过,今天好好实践了一下,反正呢,觉得代码撸好了,知道代码每一句意思会让计算机做什么,最终让它跑出来,真爽。下面看具体代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace 快速排序2
{
    public class Quicksort
    {
        public int Partition(int[] list, int low, int high)
        {


            int pivotkey = list[low];
            while (low < high)
            {
                while (low<high&&list[high] >= pivotkey) --high;      //快排的核心代码

                list[low] = list[high];

                while (low<high&&list[low] <= pivotkey) ++low;
                list[high] = list[low];

            }
            list[low] = pivotkey;
            return low;
        }




        public void Qsort(int[] list, int low, int high)   //声明一个方法对数组序列进行快排
        {
            if (low < high)
            {
                int key = Partition(list, low, high);
                Qsort(list, low, key - 1);                           //递归调用
                Qsort(list, key + 1, high);
            }
        }






        class Program
        {
            static void Main(string[] args)
            {
                int[] iArry = new int[] { 49, 38, 65, 97, 76, 13, 27, 49 };
                Quicksort ii = new Quicksort();
                ii.Qsort(iArry, 0, iArry.Length - 1);
                for (int i = 0; i < iArry.Length; i++)
                    Console.Write("{0} ", iArry[i]);


            }
        }

    }

时间复杂度:平均情况下为O(nlog2n);

空间复杂度分析:快速排序是递归的,执行时需要有一个栈来存放相应的数据。最大递归调用次数与递归树的深度一致,所以最好情况下的空间复杂度为O(log2n),最坏情况为O(n)

个人总结:写这个代码对我的收获是第一理解了快排过程及代码;

                    第二,是对核心代码的理解

         while (low < high)   

            {
                while (low<high&&list[high] >= pivotkey) --high;      //快排的核心代码

                list[low] = list[high];

                while (low<high&&list[low] <= pivotkey) ++low;
                list[high] = list[low];

            }

为何这门说呢,首先呢,外层有一个while循环,内层有两个while循环,我想说的是条件low<high,刚开始,我自认为外层while有一个low<high,内层while就可以省略,然而并不是这样,会造成数组越界。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值