首页 > 编程语言 >算法-2.内排序

算法-2.内排序

时间:2024-03-01 15:23:21浏览次数:33  
标签:right temp int void Elem 算法 排序 left

2. 内排序

2.1 三种代价为 Θ(n2) 排序算法

2.1.1 插入排序

※最佳时间代价 Θ(n),平均、最差时间代价均为 Θ(n2)

 1 template<class Elem>
 2 
 3 void swap(Elem A[],int a,int b){
 4 
 5     int temp;
 6 
 7     temp=A[a];
 8 
 9     A[a]=A[b];
10 
11     A[b]=temp;
12 
13 }
14 
15  
16 
17 template<class Elem>
18 
19 void insort(Elem A[],int n){
20 
21     for(int i=0;i<n;i++)
22 
23         for(int j=i;(j>0&&A[j]<A[j-1]);j--)
24 
25             swap(A,j,j-1);
26 
27 }
2.1.2 起泡排序

※最佳、平均、最差执行时间均为 Θ(n2)

 1 template<class Elem>
 2 
 3 void bubsort(Elem A[],int n){
 4 
 5     for(int i=0;i<n;i++)
 6 
 7         for(int j=n-1;j>0;j--)
 8 
 9             if(A[j]<A[j-1])
10 
11                 swap(A,j,j-1);
12 
13 }
2.1.3 选择排序

※最佳、平均、最差执行时间均为 Θ(n2)

 1 template<class Elem>
 2 
 3 void selsort(Elem A[],int n){
 4 
 5     for(int i=0;i<n;i++){
 6 
 7         int lowindex=i;
 8 
 9         for(int j=i;j<n;j++)
10 
11             if(A[j]<A[lowindex])
12 
13                 lowindex=j;
14 
15         swap(A,i,lowindex);
16 
17     }
18 
19 }

   

2.2 Shell排序

※平均时间代价 Θ(n1.5)

 1 template<class Elem>
 2 
 3 void inssort2(Elem A[],int n,int incr){
 4 
 5     for(int i=incr;i<n;i+=incr)
 6 
 7         for(int j=i;(j>=incr&&(A[j]<A[j-incr]));j-=incr)
 8 
 9             swap(A,j,j-incr);
10 
11 }
12 
13  
14 
15 template<class Elem>
16 
17 void shellsort(Elem A[],int n){
18 
19     for(int i=n/2;i>2;i/=2)
20 
21         for(int j=0;j<i;j++)
22 
23             inssort2(&A[j],n-j,i);
24 
25     inssort2(A,n,1);
26 
27 }

2.3 快速排序

※平均、最优时间代价 Θ(nlogn),最差时间代价 Θ(n2)

template<class Elem>
int findpivot(Elem A[],int i,int j){
    return (i+j)/2;
}

template<class Elem>
int partition(Elem A[],int l,int r,Elem &pivot){
    do{
        while(A[++l]<pivot);
        while((r!=0)&&(A[--r]>pivot));
        swap(A,l,r);
    }while(l<r);
    swap(A,l,r);
    return l;
}

template<class Elem>
void qsort(Elem A[],int i,int j){
    if(j<=i) return;
    int pivotindex=findpivot(A,i,j);
    swap(A,pivotindex,j);
    int k=partition(A,i-1,j,A[j]);
    swap(A,k,j);
    qsort(A,i,k-1);
    qsort(A,k+1,j);
}

2.4 归并排序

※最佳、平均、最差时间代价均为 Θ(nlogn)

 1 template<class Elem>
 2 
 3 void insort(Elem A[],int n){
 4 
 5     for(int i=0;i<n;i++)
 6 
 7         for(int j=i;(j>0&&A[j]<A[j-1]);j--)
 8 
 9             swap(A,j,j-1);
10 
11 }
12 
13  
14 
15 template<class Elem>
16 
17 void mergesort(Elem A[],Elem temp[],int left,int right){
18 
19     if((right-left)<=3){
20 
21         insort<Elem>(&A[left],right-left+1);
22 
23         return ;
24 
25     }
26 
27   
28 
29     int i,j,k,mid=(left+right)/2;
30 
31     if(left==right)
32 
33         return ;
34 
35     mergesort<Elem>(A,temp,left,mid);
36 
37     mergesort<Elem>(A,temp,mid+1,right);
38 
39     for(i=mid;i>=left;i--)
40 
41         temp[i]=A[i];
42 
43     for(j=right;j>=right-mid;j--)
44 
45         temp[j]=A[mid+right-j+1];
46 
47     for(i=left,j=right,k=left;k<=right;k++)
48 
49         if(temp[i]<temp[j])
50 
51             A[k]=temp[i++];
52 
53         else
54 
55             A[k]=temp[j--];          
56 
57 }

2.5 堆排序

※最佳、平均、最差时间代价均为 Θ(nlogn)

标签:right,temp,int,void,Elem,算法,排序,left
From: https://www.cnblogs.com/daydreamfanatic/p/13995212.html

相关文章

  • 代码随想录算法训练营第三十二天 | 45.跳跃游戏II ,55. 跳跃游戏,122.买卖股票的最佳时
     122.买卖股票的最佳时机II 已解答中等 相关标签相关企业 给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购......
  • faster-fifo:C++实现的python多进程通信队列 —— 强化学习ppo算法库sample-factory的C
    项目地址:https://github.com/alex-petrenko/faster-fifo需要注意,该项目给出了两种安装方法,一种是pip从pypi官网安装,一种是从GitHub上的源码安装;经过测试发现这个项目维护程度较差,因此pypi官网上的项目比较落后,因此不建议使用pypi上的安装,而是进行源码编译安装。给出源码编......
  • anaconda环境下:强化学习PPO算法仿真环境库sample-factory的python完美适配版本为pytho
    anaconda环境下:强化学习PPO算法仿真环境库sample-factory的python完美适配版本为python3.11库sample-factory地址:https://github.com/alex-petrenko/sample-factory文档地址:https://samplefactory.dev/经过对多个版本的python进行测试,anaconda环境下只有python3.11......
  • 代码随想录算法训练营day09 | leetcode 28. 找出字符串中第一个匹配项的下标、459. 重
    目录题目链接:28.找出字符串中第一个匹配项的下标-简单题目链接:459.重复的子字符串-简单题目链接:28.找出字符串中第一个匹配项的下标-简单题目描述:给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果ne......
  • 整数二分算法(自用)
    1.思想对于一个已排序数组,找到一个点,使得数组被分为两部分,即此点左部和右部(点在左部或右部中的一个),比如数组中小于等于某数x的部分与大于的部分;对于整数二分而言两个范围之间是没有空隙的,即左部分的边界x的下一个数一定在右部分。我们可以根据题目选择多种方法二分数组,大类上分......
  • 智能分析网关V4电瓶车检测与烟火算法,全面提升小区消防安全水平
    2024年2月23日,南京市某小区因电瓶车停放处起火引发火灾事故,造成巨大人员伤亡和损失。根据国家消防救援局的统计,2023年全国共接报电动自行车火灾2.1万起。电瓶车火灾事故频发,这不得不引起我们的重视和思考,尤其是在小区的管理中,电瓶车安全监管更是重中之重。随着科技的快速发展,AI视......
  • AI智能分析网关V4车辆违停算法在园区场景中的应用及特点
    随着城市化进程的加速,车辆违停问题愈发严重,给城市交通带来了极大的困扰。为了解决这一问题,AI技术逐渐被应用于车辆违停的检测中。AI检测算法在车辆违停方面的应用,主要是通过计算机视觉技术,对道路上的车辆进行实时监控和识别。通过图像处理和深度学习等技术,AI可以自动识别车辆是否......
  • AI智能分析网关V4:抽烟/打电话/玩手机行为AI算法及场景应用
    抽烟、打电话、玩手机是人们在日常生活中常见的行为,但这些行为在某些场合下可能会带来安全风险。因此,对于这些行为的检测技术及应用就变得尤为重要。今天来给大家介绍一下TSINGSEE青犀AI智能分析网关V4抽烟/打电话/玩手机检测算法及其应用场景。将监控现场部署的摄像头接入到AI......
  • 文心一言 VS 讯飞星火 VS chatgpt (204)-- 算法导论15.3 3题
    三、考虑矩阵链乘法问题的一个变形:目标改为最大化矩阵序列括号化方案的标量乘法运算次数,而非最小化。此问题具有最优子结构性质吗?需要写代码的时候,请用go语言。文心一言,代码正常运行:首先,我们要明确矩阵链乘法问题的原始形式:给定一个矩阵链(A_1,A_2,\ldots,A_n),我们要找到......
  • 代码随想录算法训练营第三十一天 | 53. 最大子序和, 376. 摆动序列,455.分发饼干
    455.分发饼干 已解答简单 相关标签相关企业 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] ......