惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Docker
小众软件
小众软件
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
酷 壳 – CoolShell
酷 壳 – CoolShell
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
V
V2EX
阮一峰的网络日志
阮一峰的网络日志
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - Franky
WordPress大学
WordPress大学
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
Jina AI
Jina AI
博客园 - 聂微东
S
SegmentFault 最新的问题
量子位
宝玉的分享
宝玉的分享
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园_首页

博客园 - gxc

C#2.0中的泛型约束(转载) 解决‘“System.Configuration.ConfigurationSettings.AppSettings”已过时’的警告 《雷神之锤III》里求平方根倒数的函数 回溯法(vc)百鸡百钱问题 回溯法(vc)八皇后问题 六十六条经典禅语 prototype.js和Ajax 悖论 标签的使用(2) 标签的使用(1) 自底向上的归并排序 自顶向下的归并排序 归并排序之归并算法 Josephus问题(循环链表) 找质数算法(Sieve of Eratosthenes筛法) 堆排序 直接选择排序 Some of the new features from ASP.NET 2.0 在ASP.NET中使用AJAX
快速排序算法
gxc · 2005-12-23 · via 博客园 - gxc

快速排序又称为划分交换排序。其基本思想是:在待排序数列中任选出一个数作为基准,用这个基准将数列划分为左右两个子区,使得左子区的数都不大于基准数,而右子区的数都不小于基准数,称为完成第一次划分。如果左子区或右子区不为空,则对它进行同样的划分,直至为空为止。
要实现第一次划分,具体的做法是,设置两个指针,一个从右往左扫描,发现比基准数小的就和基准数交换;同时另一个从左往右扫描,发现比基准数大的就和基准数交换,那么,当两个指针相遇的时候,左边的数已经都比基准数小,右边的都比基准数大,而指针指的地方刚好就是基准数的最终位置。
public static void QUICKSORT(int[] N,int left,int right)
{
    //数组元素如果不大于一个就无需排序。
    if (left < right)
    {
        int p = PARTITION(N, left, right);  //第一次划分
        QUICKSORT(N, left, p-1);    //递归处理左子区
        QUICKSORT(N, p+1, right);   //递归处理右子区
    }    
}
//划分
public static int PARTITION(int[] R, int left,int right)
{
    int i = left;
    int j = right;
    int temp = R[i];
    while (i != j)
    {
        //从左往右扫描,查找第一个比基准数小的数
        while ((R[j] >= temp) && (i<j))
        {
            j--;
        }
        if (i < j)               
        {
            //交换找到的数和基准数,由于基准数还需交换多次,所以暂时不用将temp->R[j]
            R[i] = R[j];
            i++;
        }

        while ((R[i] <= temp) && (i < j))
        {
            i++;
        }
        if (i< j)
        {
            R[j] = R[i];
            j--;
        }
    }
    //定位基准数
    R[i] = temp;
    return i;    
}
顺便提一下,上面的递归算法用到的方法叫做“分治法”(divide_and_comquer),就是使用两个递归调用,每个调用处理将整个问题划分成两个独立的子问题来解决。