快速排序--三元选中值代码实现

  • 三元选中值代码实现

三点选中位主元,针对不同的Cutoff运行结果,以及是否使用Cutoff的运行结果

//北航机试2020/3/28
/*
头中尾三位取中
针对不同的数据量
*/

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<algorithm>

using namespace std;

#define MAXN  1000000

int Cutoff = 50;

void Insertion_Sort(int A[],int N)
{
    int p,i;
    int temp;
    for(p = 1;p<N;p++)
    {
        temp = A[p];
        for(i = p;i>=1&&temp<A[i-1];i--)
        {
            A[i] = A[i-1];
        }
        A[i] = temp;
    }
}

int Median3(int A[],int Left,int Right)
{
    int Center = (Left + Right) / 2;
    if(A[Left] > A[Center])
        swap(A[Left],A[Center]);
    if(A[Left] > A[Right])
        swap(A[Left],A[Right]);
    if(A[Center]>A[Right])
        swap(A[Center],A[Right]);
    /* 此时A[Left] <= A[Center] <= A[Right] */
    swap(A[Center],A[Right-1]);/* 将基准Pivot藏到右边*/
    /* 只需要考虑A[Left+1] … A[Right-2] */
    return A[Right-1];
}

void Qsort(int A[],int Left,int Right)
{
    //使用Cutoff阈值来优化快速排序
    int pivot,Low,High;
    //int Cutoff = 50;使用全局变量用来测试
    if(Cutoff <= Right-Left)/* 如果序列元素充分多,进入快排 */
    {
        pivot = Median3(A,Left,Right);//选主元
        Low = Left;//元素划分
        High = Right-1;
        while(1)
        {
            while(A[++Low]<pivot);
            while(A[--High]>pivot);
            if(Low<High) swap(A[Low],A[High]);
            else break;
        }
        swap(A[Low],A[Right-1]);
        Qsort(A,Left,Low-1);
        Qsort(A,Low + 1,Right);
    }
    else/* 元素太少,用简单排序 */
    {
        Insertion_Sort(A+Left,Right-Left+1);
    }
}

void Quick_Sort(int A[],int N)
{
    Qsort(A,0,N-1);
}

void print(int A[],int N)
{
    int i;
    for(i = 0;i<N;i++)
    {
        if(i == N-1)
            printf("%d\n",A[i]);
        else
            printf("%d ",A[i]);
    }
}
void test(int A[],int arg_Cutoff)
{
    Cutoff = arg_Cutoff;
    clock_t start,end;
    start = clock();
	Quick_Sort(A,MAXN);
	end = clock();
	printf("执行时间Cutoff=%d %f s\n",Cutoff,(double)(end-start)/CLOCKS_PER_SEC);
}

int A1[MAXN],A2[MAXN],A3[MAXN],A4[MAXN],A5[MAXN],A6[MAXN];

int main()
{


    int i;

    srand((unsigned)time(NULL));

	for(i = 0;i<MAXN;i++)
	{
		 A6[i] = A5[i]=A4[i] = A3[i]=A2[i] = A1[i] = rand();
	}
	test(A1,50);
	test(A2,100);
	test(A3,200);
	test(A4,300);
	test(A5,400);
	test(A6,1);

    return 0;
}
/*
MAXN = 100000(十万级)
执行时间Cutoff=50  0.014000 s
执行时间Cutoff=100 0.017000 s
执行时间Cutoff=200 0.023000 s
执行时间Cutoff=300 0.023000 s
执行时间Cutoff=400 0.026000 s

MAXN = 1000000(百万级) 注意此时的数组申请,应设置为全局变量,否则程序
执行时间Cutoff=50  0.139000 s
执行时间Cutoff=100 0.157000 s
执行时间Cutoff=200 0.190000 s
执行时间Cutoff=300 0.278000 s
执行时间Cutoff=400 0.280000 s

hahahaha 你发现了什么,在Cutoff为50的时候,运行的速度最快
但是如果不使用Cutoff呢?

MAXN = 1000000(百万万级) 发现区别不是很明显
执行时间Cutoff=50  0.143000 s
执行时间Cutoff=100 0.197000 s
执行时间Cutoff=200 0.205000 s
执行时间Cutoff=300 0.241000 s
执行时间Cutoff=400 0.283000 s
执行时间Cutoff=1   0.156000 s

MAXN = 10000000(千万级)  发现使用了cutoff的算法要快一些
执行时间Cutoff=50  1.470000 s
执行时间Cutoff=100 1.431000 s
执行时间Cutoff=200 1.622000 s
执行时间Cutoff=300 1.902000 s
执行时间Cutoff=400 2.210000 s
执行时间Cutoff=1   1.696000 s
*/

小结:

  • 快速排序非常快,在数据级别达到千万级别的时候运行速度才会上
  • 上述的实验结果间接表明:插入排序适合数据量较小(因为不同的Cutoff的运行时间不同)
  • 递归的时候确实会影响程序的运行(此处的递归和不使用递归(不使用的比较其实是有点问题的,因为是以Cutoff为限,决定是否递归,也就意味着,两者的递归深度没有那么那么的大)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ARIMA(自回归积分滑动平均模型)是一种常用的时间序列分析方法,用于对时间序列数据进行预测和建模。在Python中,我们可以使用statsmodels库来实现ARIMA模型。 首先,我们需要导入所需的库: ```python import pandas as pd import numpy as np import statsmodels.api as sm ``` 接下来,我们需要加载时间序列数据。可以使用pandas库的`read_csv`函数从CSV文件中加载数据,或者使用其他适用的方法加载数据。 ```python data = pd.read_csv('data.csv', parse_dates=['date'], index_col='date') ``` 数据加载后,我们可以通过观察数据的统计特征和绘制时序图来了解数据的性质。 ```python data.describe() data.plot() ``` 然后,我们需要进行时间序列的差分,以使其变得平稳。平稳时间序列的波动性较小,更容易建模和预测。 ```python diff = data.diff().dropna() diff.plot() ``` 接下来,我们可以使用`sm.tsa.ARIMA`函数构建ARIMA模型。 ```python model = sm.tsa.ARIMA(diff, order=(p, d, q)) ``` 在这里,`order`参数是一个三元组,代表ARIMA模型中的(p, d, q),分别代表自回归阶数、差分阶数和滑动平均阶数。可以通过对数据的观察和使用模型选择方法(如AIC、BIC)来确定这些。 完成模型构建后,我们可以使用`model.fit()`函数来拟合模型。 ```python results = model.fit() ``` 然后,可以使用`results.summary()`函数来查看关于模型的详细信息和统计指标。 最后,我们可以使用拟合后的模型对未来的数据进行预测。 ```python forecast = results.forecast(steps=n) ``` 在这里,`steps`参数代表预测的步数,`n`代表需要预测的未来时间点的个数。 以上是基于Python实现的ARIMA模型的简要步骤。根据具体的数据和需求,可能会有一些额外的步骤和调整。 ### 回答2: ARIMA(自回归移动平均模型)是一种常用的时间序列预测方法,可以用于分析和预测各种有规律的时间序列数据。下面是一个基于Python实现ARIMA模型的代码示例: 首先,需要安装statsmodels库来实现ARIMA模型: ```python !pip install statsmodels ``` 然后,导入所需的库和模块: ```python import pandas as pd import numpy as np from statsmodels.tsa.arima.model import ARIMA import matplotlib.pyplot as plt ``` 接下来,加载时间序列数据,可以是一个csv文件或一个数组: ```python data = pd.read_csv('data.csv', header=None) ``` 然后,将时间序列数据转换为一维数组: ```python data = data.values.flatten() ``` 接下来,创建ARIMA模型: ```python model = ARIMA(data, order=(1, 0, 1)) # (p, d, q)参数可以根据实际情况进行调整 ``` 然后,训练模型: ```python model_fit = model.fit() ``` 可以通过调用`model_fit.summary()`来查看模型的详细信息。 最后,可以使用训练好的模型进行预测: ```python prediction = model_fit.predict(start=len(data), end=len(data)+n-1) # n为需要预测的时间步长 ``` 最后,可以将预测结果可视化展示: ```python plt.plot(prediction, label='Prediction') plt.legend() plt.show() ``` 以上就是一个基于Python实现的简单ARIMA模型代码示例。需要注意的是,ARIMA模型的参数调整和模型训练过程可能会根据实际数据和问题的不同而有所差异,需要结合具体情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值