排序算法笔记-快速排序 Quicksort

快速排序一直都是记忆中的经典,对于那个pivot(枢轴)印象特深。在百度了一些资料后,很快的熟悉了快排的算法。以下分享代码可以直接在VS-控制台程序中运行。

参考到的资料有:

http://blog.csdn.net/wuxinyicomeon/article/details/5996675

http://www.dwz.cn/yiEnN

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace test
{
    class Program
    {
        /*
         理解快排,关键在于看懂一次排序单元的过程,其巧妙之处是对low和high的使用(其理解的精髓在于下面这句话:low和high指示的数组成员借助key的空间进行了赋值交换,
         * 即low赋值给key,high--后找到目标赋值给low指示的位置,low++后把新找到的数又给high,最后把key放回++后的low的位置。
         * 快排的时间复杂度为【最差】O(n^2)【平均】O(n*log2n) 【空间】复杂度为O(log2n)~O(n)
         */
        static void Main(string[]args)
        {
            int[]array={49,38,65,97,76,13,27};
            sort(array,0,array.Length-1);
            Console.ReadLine();
        }

        /**一次排序单元,完成此方法,key左边都比key小,key右边都比key大。
        **@paramarray排序数组
        **@paramlow排序起始位置
        **@paramhigh排序结束位置
        **@return单元排序后的数组
        */
        private static int sortUnit(int[]array,int low,int high)
        {
            int key=array[low];
            while(low<high)
            {
                /*从后向前搜索比key小的值*/
                while(array[high]>=key&&high>low)
                --high;
                /*比key小的放左边*/
                array[low]=array[high];
                /*从前向后搜索比key大的值,比key大的放右边*/
                while(array[low]<=key&&high>low)
                ++low;
                /*比key大的放右边*/
                array[high]=array[low];
            }
            /*左边都比key小,右边都比key大。
            //将key放在游标当前位置。
            //此时low等于high
            */
            array[low]=key;
            Console.WriteLine(string.Join(",",array));
            return high;
        }
 
 
        /**快速排序
        *@paramarry
        *@return
        */
        public static void sort(int[]array,int low,int high)
        {
            if(low>=high)
            return;
            /*完成一次单元排序*/
            int index=sortUnit(array,low,high);
            /*对左边单元进行排序*/
            sort(array,low,index-1);
            /*对右边单元进行排序*/
            sort(array,index+1,high);
            }
        }
}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值