首页 > 其他分享 >快速排序

快速排序

时间:2024-03-09 12:23:35浏览次数:25  
标签:index end int 复杂度 start pivot 排序 快速

快速排序-V1

一、代码实现

1.大致思路

假如有一个数,这个数组自然有序
假如有2个数,我们选第一个数为标准,比它小的数排它前面,比它大排后面,那么这两个数将有序。
假如有3个数,我们选第一个数为标准,比它小的数排它前面,比它大排后面。
假如有4个数,我们选第一个数为标准,比它小的数排它前面,比它大排后面。
。。。
假如有n个数,我们选第一个数为标准,比它小的数排它前面,比它大排后面。
可以发现,从n到1,可以看作一个递归的过程,把排在前面的数和排在后面的数分别看作新的数组进行排列

2.代码

我们直接上代码:

int partition(int*a,int start_index,int end_index){
//    选择第一个元素作为pivot
    int pivot = a[start_index];
//    左右两个索引
    int left = start_index;
    int right = end_index;
    while (left<right){
//        右指针先移动
        while (left<right){
            if(a[right]<pivot) {
                a[left] = a[right];
                break;
            }
            else
                right--;
        }
        while (left<right){
            if(a[left]>pivot){
                a[right] = a[left];
                break;
            }
            else
                left++;
        }
    }
    a[left] = pivot;
    return left;
}
void QuickSort_v1(int *a,int start_index,int end_index){
    if(start_index>end_index)
        return;
    int pivot_index = partition(a,start_index,end_index);
    QuickSort_v1(a,start_index,pivot_index-1);
    QuickSort_v1(a,pivot_index+1,end_index);
}

3.代码讲解

当主函数调用QiuckSort函数,函数将选定一个pivot作为标准对数组排列,并得到pivot最后的索引。
再对索引左右分别进行QuickSrt。
递归停止条件即为左右索引相等,即数组只有一个元素自然有序。

二、复杂度

空间复杂度:O(log_2N)
时间复杂度:O(Nlog_2N)

  • 空间复杂度:由于递归调用会消耗栈资源,对于一个有n个元素的数组,最坏情况需要递归调用log_2N次。
  • 时间复杂度:每次递归调用都会循环N、N/2、N/4、、、1,则总共O(Nlog_2N)

标签:index,end,int,复杂度,start,pivot,排序,快速
From: https://www.cnblogs.com/saopigqwq233/p/18062493

相关文章

  • 归并排序
    归并排序分析一、代码实现voidmerge(int*a,intlow,intmid,inthigh){int*b=newint[high-low+1];inti=low,j=mid+1,k=0;while(i<=mid&&j<=high){if(a[i]<a[j]){b[k++]=a[i++];}elseb[k++]=a......
  • Shell排序复杂度分析
    Shell排序复杂度分析1.大致思想可以把希尔排序看作是发牌员,给每人轮流发一张牌。需要给n个人发牌,每人从第二张开始分别进行插入排序,那么第一轮下来后,每人的牌就是有序的。接下来按照刚刚的发牌顺序把牌再收起来,减少人数,不断重复这个步骤,直到只剩下一个人,那么就是直接插入排序......
  • MYSQL学习笔记9: DQL排序查询(升降序)
    DQL排序查询select字段列表from表名orderby字段1排序方式1,字段2排序方式2;排序方式ASC升序(默认)DESC降序如果是多字段排序,第一个字段值相同,会根据第二个字段的值进行排序,以此类推按年龄降序排序select*fromworkersorderbyagedesc;......
  • 通达信超金钻大涨排序指标公式源码
    {通达信超金钻大涨排序指标公式源码}X_1:=DYNAINFO(15)/DYNAINFO(4)/FINANCE(46)*(DYNAINFO(4)-REF(CLOSE,1))/REF(CLOSE,1)*10000;今开%:=(OPEN/REF(CLOSE,1)-1)*100;X_7:=CLOSE>=ZTPRICE(REF(CLOSE,1),0.1);X_8:=BArslAstCOUNT(X_7);昨日涨停次数:REF(X_8,1),NODRAW;X_......
  • 通达信竞价绝杀排序指标公式
    {通达信竞价绝杀排序指标公式}{指标介绍:1.黄金甲信号稳定的创业板票(主力净额大于1500万,占比大于8%,流通市值小于80亿);2.情绪周期里面的三板以上的主板票(主力净额大于1500万,占比大于8%,流通市值小于150亿);3.昨日涨停的创业板票,今日高开(主力净额大于800万,占比大于8%,流通市值......
  • 白菜GPT | 快速上手
    白菜GPT旨在提供稳定高效且免费的OpenAIAPI转发服务,帮助国内GPT应用学习相关爱好者及从业者,提供便捷、低成本、长期稳定的GPT中转服务,免费提供中转API_KEY,从而降低各位学习成本,提高OpenAI学习应用效率,更多学习文档,请参阅官方教程本教程面向第一次接触白菜GPT的用户,仅需四步,即可......
  • [Redis] 01-Redis快速入门
    一、Redis简介Redis属于键值对(key-value)数据库Redis中所有的数据都是以key-value的形式存储在内存中的所以读写Redis非常的快,在高并发的场景下,性能非常的好二、Redis服务端(redis-server)的安装省略。建议使用docker安装。Docker安装redis(保姆级教程&图文并茂)-腾讯......
  • FMS设备监察系统无线传输模块及网关快速应用教程
    设备监察系统又叫做FMS(Facilities  Monitoring  System),该FMS系统由 GUI(配置上位机)、FMS网关和lora无线模块节点三部分组成。亿佰特上市的E53-470FMS22S、E53-DTU(470FMS22)产品是基于LoRa扩频技术开发的设备监察系统无线传输模块及网关,其强大的抗干扰能力,让无线通信在工业现......
  • 快速制定、分解、落地OKR的框架,建议你认真看!
    制定OKR(ObjectivesandKeyResults,目标与关键成果)并没有一套固定的公式,因为每个组织、团队或项目的具体情况和目标都是独特的。然而,有一些通用的步骤和考虑因素可以帮助你制定有效的OKR。以下是一个指导性的框架:一、明确组织或团队的战略目标确定长期和短期目标:明确组织或团......
  • 在Docker中,怎么快速查看本地的镜像和容器?
    在Docker中,查看本地的镜像和容器分别可以通过以下两条命令来快速实现:1.查看本地镜像要查看本地计算机上存储的所有Docker镜像,可以使用dockerimages命令。这个命令会列出所有可用的镜像,包括镜像的存储库名称、标签、镜像ID、创建时间和所占用的空间。dockerimages输出示例:......