首页 > 代码库 > 快速排序

快速排序

 

 什么是快速排序

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


 实现过程

 设要排序的数据存放在数组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);
            }
        }

  学习心得

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



快速排序