快速排序

来源:互联网 发布:php网址导航源码 编辑:程序博客网 时间:2024/06/07 05:05

 

 什么是快速排序

 快速排序可以说是对冒泡排序的一种改进,通过选择某个基准点经过一次排序,然后把数据通过基准点分为两个部分。一部分小于基准点;一部分大于基准点;


 实现过程

 设要排序的数据存放在数组A[0]...A[N-1]中,然后从数组总任意选择一个数据作为基准点,将所有比基准点小的数据放到它的前面,比它小的放到它的后面,这样经过一次交换就分成了两个独立的部分。接着在运用分治的思想,对剩下的接着进行快速排序。


 分析过程

 比如我们有一组数据: 52、45、63、98、21、7  

 步骤一:选择第一个数据也就是52作为基准点的话,先从最后向前找到第一个小于52的7

                      7、45、63、98、21、52          63————52

 步骤二:接着从前找到第一个比45大的数据52

                      7、45、52、98、21、63          21————52

                      7、45、21、98、52、63           98————52

                      7、45、21、52、98、63

  从最后一组数据中我们可以看出,经过一次的快速排序,就把数组根据52划分为了两个部分。接着只要在对前半部分和后半部分分别执行快速即可,用到了分治的思想。


  代码实现

  有了以上实现的过程,代码上就简单多了

   /// <summary>        /// 快速排序实现过程        /// </summary>        /// <param name="s">要排序的数组</param>        /// <param name="low">数组的第一个元素的下标</param>        /// <param name="high">数组的最后一个元素的下标</param>        /// <returns></returns>       static int AdjustArray(int []s,int low,int high)        {           //把low和high分别赋给i和j            int i = low, j = high;           //以第一个元素为基准点,并且保存在x中            int x = s[i];            while(i<j)            {                //通过这个循环,从后向前查找第一个小于基准点的下标                while(i<j && s[j]>=x)                {                    j--;                }                if(i<j)                {                    //找到第一个小于基准点的后直接调换                    s[i] = s[j];                    //指针前移动                    i++;                }                //与上面类似,从前向后找大于基准点的小标                while(i<j&& s[i]<x)                {                    i++;                }                if(i<j)                {                    //找到后发生调换                    s[j] = s[i];                    j--;                }            }           //退出时,直接把基准点保存到目前的I中            s[i] = x;            return i;        }        //分治,通过快速排完后,再对前半部分,后半部分分别进行快速排序      static   void quick_sort1(int []s,int l,int r)        {            if(l<r)            {                int i=AdjustArray(s,l,r);                quick_sort1(s,l,i-1);                quick_sort1(s, i + 1, r);            }        }

  学习心得

  小编在学习中也是经过了一段时间琢磨完成的,劝各位想学的,就在纸上画画、电脑上敲一敲,你一定会开窍的。


0 0
原创粉丝点击