zoukankan      html  css  js  c++  java
  • 排序算法:快速排序法

    快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都小于或等于基准值, 基准右边的元素值 都大于基准值。然后以基准数为界,分左和右两个子序列,递归调用,直至完成排序。

    该方法的基本思想:一个未排序数组s[]

    1.先从数列中取出一个数作为基准数(一般取第一个),保存到temp=s[l]此时第一个数组形成一个“坑”

    2.分区过程, i = l j = r

       (1)此时s[i]形成一个“坑”,j向前遍历,直至找到一个s[j]<temp,则s[i]=s[j],i++

       (2)此时s[j]形成一个“坑”,从i向后遍历,直至找到一个s[i]>temps[j]=s[i],j--

       (3)当j==i直接停止循环;

    3.再对左右区间重复第二步,直到各区间只有一个数;

    原始数据:初始值l = 0(基准数下标)  r = 7(最大下标)   temp = s[i] = 6(基准数值)

     0
     6  10  90  52  77 

    第一次循环过程:

    0
    6

         基准数:temp=s[0]=6

    1,初始 i=l=0, j=r=7, 由j向后查找; 由于temp>s[7],则s[0]=s[7]=6,  (i++)-->1,  j=7;

    0 1 2 3 4 5 6 7
    3 10 4 90 52 77 8 3

    2,i=1, j=7, 由i向前查找; 由于temp<s[1], 则s[7]=s[i]=10,  (j--)-->6, i=1;

    0 1 2 3 4 5 6 7
    3 10 4 90 52 77 8 10

    3,i=1, j=6, 由j向后查找; 由于temp>s[2], 则s[1]=s[2]=4, (i++)-->2, j=2; 由于j==i,  停止循环,  s[i]=temp;

    0 1 2 3 4 5 6 7
    3 4 6 90 52 77 8 10

    第一次结束后,从6将数组分成左右两个子数组,进行递归;

    代码如下:

    /**************************************************************************************
     *  Description:
     *   Input Args:
     *  Output Args:
     * Return Value:
     *************************************************************************************/
    int quick_sort (int s[], int l, int r)
    {
        if(l < r)
        {
            int i = l, j = r, temp = s[l];
            while (i < j)    
            {                
                while(i < j && s[j] >= temp) //小到大
                    j--;              
                if(i < j)             
                    s[i++] = s[j];    
    
                while(i < j && s[i] < temp)
                    i++;             
                if(i < j)  
                   s[j--] = s[i];   
            }
    
            s[i] = temp;
            quick_sort(s, l, i - 1); //左子数组
            quick_sort(s, i + 1, r); //右子数组
        }
    
        return 0;
    } /* ----- End of quick_sort()  ----- */

    参考链接:http://blog.csdn.net/morewindows/article/details/6684558

  • 相关阅读:
    BadgeView使用
    设计模式(一)单例模式的七种写法
    Android 之使用LocalBroadcastManager解决BroadcastReceiver安全问题
    AsyncTask源码分析
    Android微信支付—注意事项
    Android微信支付SDK开发
    Android支付宝SDK开发笔记
    onInterceptTouchEvent与onTouchEvent默认返回值
    线程间的通信方式3--Handler
    Android应用程序启动过程(二)分析
  • 原文地址:https://www.cnblogs.com/xiaoxing/p/3981572.html
Copyright © 2011-2022 走看看