栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

快速排序quicksort算法详细图解附代码实现(C++)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

快速排序quicksort算法详细图解附代码实现(C++)

快速排序的思想我就不讲了,下面直接上流程图

下面是快速排序的函数声明,可以看到这里的代码思路是接受两个迭代器来完成的,lp迭代器指向的是数组的第一个元素,rp迭代器指向的是数组最后一个元素(注意是vector.end()-1,而非vector.end())

void quicksort(vector::iterator lp, vector::iterator rp)
使用数组的第一个元素作为pivot(基准数)进行快排
void quicksort(vector::iterator lp, vector::iterator rp)
{
    if(rp - lp > 0)	
    // 判断数组中是否少于一个元素
    {
        vector::iterator olp = lp, orp = rp;
        // original-lp和original-rp用于记录当前数组的第一个和最后一个元素位置
        
        int pivot = *lp;
		// 使用第一个元素作为pivot,这里直接用*olp来表示pivot的值也可以,这里是为了能更直观
		
        while(lp != rp)
        // 循环体里面就是根据刘成都来执行
        {
            while(*rp >= pivot && rp > lp)
                --rp;
            //rp要么指到一个比pivot小的元素,要么指到pivot本身

            while(*lp <= pivot && rp > lp)
                ++lp;
            // lp要么指到rp,要么指到一个比pivot大的元素

            if (rp != lp)
                swap(*rp, *lp); 
            // 若rp和lp没相遇,那么交换元素进行下一轮循环
        }
        
        swap(*olp, *rp);
        // 这里做的是跳出循环后,rp与pivot进行交换的步骤
       
        quicksort(olp, lp - 1);	
       	// 对pivot左边的子数组进行快排
       	
        quicksort(rp + 1, orp);
        // 对pivot右边的子数组进行快排
    }
}

假设待排序的序列是基本有序的,这时候快排的效率就会降低,因此使用随机选取pivot的方法可以在一定程度优化算法。

随机选取pivot(基准数)进行快排
void quicksort(vector::iterator lp, vector::iterator rp)
{
    if(rp - lp > 0)	
    // 判断数组中是否少于一个元素
    {
        vector::iterator olp = lp, orp = rp;
        // original-lp和original-rp用于记录当前数组的第一个和最后一个元素位置
        
        auto pivot_it = (lp + rand() % (rp - lp + 1));
        int pivot = *pivot_it;
        swap(*olp, *pivot_it);
		// 这里用这三行代码就可以实现随机选取pivot,并且不需要动下面的代码
		
        while(lp != rp)
        // 循环体里面就是根据刘成都来执行
        {
            while(*rp >= pivot && rp > lp)
                --rp;
            //rp要么指到一个比pivot小的元素,要么指到pivot本身

            while(*lp <= pivot && rp > lp)
                ++lp;
            // lp要么指到rp,要么指到一个比pivot大的元素

            if (rp != lp)
                swap(*rp, *lp); 
            // 若rp和lp没相遇,那么交换元素进行下一轮循环
        }
        
        swap(*olp, *rp);
        // 这里做的是跳出循环后,rp与pivot进行交换的步骤
       
        quicksort(olp, lp - 1);	
       	// 对pivot左边的子数组进行快排
       	
        quicksort(rp + 1, orp);
        // 对pivot右边的子数组进行快排
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/928183.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号