问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

【比较难写的算法】最坏情况线性时间的选择

发布网友 发布时间:2022-04-28 21:34

我来回答

2个回答

热心网友 时间:2022-06-23 07:19

实际上比平均情况下线性时间的选择要复杂很多(算法导论上伪代码都没有)
问题是快速排序要求枢纽元在最后一个,如果采用hoare的划分算法,就没有这个要求。而给出的是枢纽元的值,然后要找到位置(搜索一遍),再交换。
如果采用hoare划分法,不用搜索,不过算法和书上描述的就稍有不同了。

另外,因为代码复杂,所以对于随机输入,此算法较慢
下面是hoare划分的选择代码

# include <ctime>
# include <cstdlib>
# include <iostream>

inline void swap(int &x, int&y)
{
int temp = x;
x = y;
y = temp;
}

// A[p..r]
int hoarePartitionX(int *A, int p, int r, int x)
{
int i = p - 1;
int j = r + 1;

for(;;)
{
while( A[--j] > x)
;
while( A[++i] < x)
;
if(i<j)
{
swap(A[i], A[j]);
}
else
{
return j;
}
}
}

// A[0..size-1]
void insertionSort(int *A, int size)
{
int i;
int key;

for(int j=1; j<size; j+=1)
{
key = A[j];
i = j - 1;
while(i >= 0 && A[i] > key)
{
A[i+1] = A[i];
i -= 1;
}
A[i+1] = key;
}
}

// return the ith smallest element of A[p..r]
int select(int *A, int p, int r, int i)
{

if(p == r) // only one element, just return
{
return A[p];
}

// #1. groupNum & rest
int groupNum = (r - p + 1) / 5; // not counting the rest
int rest = (r - p + 1) % 5;

// #2. sort the groups

for(int t=0; t<groupNum; t+=1)
{
insertionSort(A + p + t*5, 5);
}

if(rest != 0)
{
insertionSort(A + p + groupNum * 5, rest);
}

// #3. get the mid value x
int *mids;
if(rest == 0)
mids = new int[groupNum];
else
mids = new int[groupNum+1];

for(int t=0; t<groupNum; t+=1)
{
mids[t] = A[ p + t*5 + 2 ];
}
if(rest != 0)
{
mids[groupNum] = A[ p + groupNum*5 + (rest-1)/2 ];
}

int x;
if( rest == 0 )
{
x = select(mids, 0, groupNum-1, (groupNum-1) / 2 + 1);
}
else
{
x = select(mids, 0, groupNum, groupNum / 2 + 1);
}

delete []mids;

// #4. partition with x
int k = hoarePartitionX(A, p, r, x) - p + 1; // so the value A[p+k-1] is the kth smallest

// #5.
if(i <= k)
{
return select(A, p, p+k-1, i);
}
else
{
return select(A, p+k, r, i-k);
}
}

int main()
{
int array[100];
for(int i=0; i<100; i+=1)
array[i] = i;

for(int i=0; i<100; i+=1)
{
int rnd = rand()%100;
swap(array[0], array[rnd]);
}

std::cout << select(array, 0, 99, 82);

std::cin.get();
return 0;
}

热心网友 时间:2022-06-23 07:19

你就是把快速排法,改一下就可以了,很快的,
【比较难写的算法】最坏情况线性时间的选择

实际上比平均情况下线性时间的选择要复杂很多(算法导论上伪代码都没有)问题是快速排序要求枢纽元在最后一个,如果采用hoare的划分算法,就没有这个要求。而给出的是枢纽元的值,然后要找到位置(搜索一遍),再交换。如果采用hoare划分法,不用搜索,不过算法和书上描述的就稍有不同了。另外,因为代码...

算法导论之线性时间选择算法

算法导论的第9章介绍了线性时间选择算法,该算法主要解决顺序统计量中的问题,包括查找最小值、最大值以及在O(n)时间内找到第i小的元素,即线性选择问题。相比于O(nlgn)的传统方法,如堆排序或归并排序,这种算法更高效。最小值和最大值的确定是通过锦标赛模型,每比较一次,元素间的排名就会更新,共...

算法导论之线性时间选择算法

尽管RANDOMIZED-SELECT在最坏情况下的时间复杂度为Θ(n^2),但由于其随机性,最坏情况的出现概率极低。其期望时间复杂度为O(n),确保了在实际应用中的高效性。《算法导论》第三版为我们提供了深入理解这一算法的基石。总结来说,线性时间选择算法是一场算法策略的精彩展现,它巧妙地结合了随机性和优...

下列算法中,最坏情况下时间复杂度最低的为___。

【答案】:C 快速排序法需要比较nlog2n;堆排序法,最坏情况需要0(nlog2n)次比较;二分法查找只适用于顺序存储的有序表,对于长度为n的有序线性表,最坏情况只需比较log2n次。故本题选C。

紧急!!!有什么排序方法?各有什么特点?

(1)冒泡排序 简单,时间复杂度O(n^2)(2)插入排序 简单,比冒泡难写,时间复杂度O(n^2),通常比冒泡快 (3)快速排序 稍难,平均O(nlogn),最坏O(n^2)(4)选择排序 简单 O(n^2)(5)归并排序 使用了递归算法 (6)堆排序 O(nlogn),时间很稳定 (7)计数排序 线性时间排序算法,不过要求...

算法和建模最难的是思想还是技术?

很多场合可以用到竞赛中) 6、最优化理论的三大非经典算法:模拟退火法、神经网络、遗传算法(这些问题是 用来解决一些较困难的最优化问题的算法,对于有些问题非常有帮助,但是算法的实 现比较困难,需慎重使用) 7、网格算法和穷举法(网格算法和穷举法都是暴力搜索最优点的算法,在很多竞赛 题中有应用,...

有两个N(1≤N≤100)个元素的数组A和B,其中A来自输入,将其"赋值"给B...

一般算法可以使用,以便选择,三种基本控制结构循环组合。 测试中心两个算法的复杂性考试会话:两个笔试中心,定期检查,在笔试中,有70%的机会,主要是选择的形式为2分的得分内存测试中心重点内容,读者应该还记得,时间复杂度和空间复杂度的概念。 算法时间复杂度的算法的时间复杂度是实现算法所需的计算工作。 /&gt;在不同...

如何计算时间复杂度

三、考虑最坏和平均情况 在计算时间复杂度时,我们需要考虑最坏的情况和平均情况。最坏情况下的时间复杂度最能反映算法性能的上限,因为它确保在所有情况下都能满足一定的性能要求。同时,平均情况下的时间复杂度也很重要,因为它提供了算法的预期性能。在进行时间复杂度分析时,通常需要考虑到这两者。一般...

紧急!!!有什么排序方法?各有什么特点?

(1)冒泡排序 简单,时间复杂度O(n^2)(2)插入排序 简单,比冒泡难写,时间复杂度O(n^2),通常比冒泡快(3)快速排序 稍难,平均O(nlogn),最坏O(n^2)(4)选择排序 简单 O(n^2)(5)归并排序 使用了递归算法(6)堆排序 O(nlogn),时间很稳定(7)计数排序 线性时间排序算法,不过要求数据种类少常见的排序...

我是湖南邵阳职业技术学院的专科学生,学的是计算机科学与技术,然后明 ...

1) 算法的描述和分析:算法的时间复杂度和空间复杂度、最坏的和平均的时间复杂度第二章 线性表一、学习目的和要求本章的目的是介绍线性表的逻辑结构和各种存储表示方法,以及定义在逻辑结构上的各种基本运算及其在存储结构上如何实现这些基本运算。要求在熟悉这些内容的基础上,能够针对具体应用问题的要求和性质,选择合适...

最坏情况下时间复杂度最低的算法是 陈述算法在最坏情况下的时间复杂度 最坏情况下速度最快的排序算法是 线性时间选择算法 线性时间选择算法图解 算法的最坏时间复杂度 线性时间算法 著名算法的最坏复杂度 最坏适应算法图解
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...9300的手机,拍照的时候因为屏幕很大自拍的时候按不到开关~前面的... 帮我的作文取个好题目 我的作文是仿写《生命 生命》这篇文章的。_百度... 40 多亿美金BD背后的超前押注者 40 多亿美金BD背后的超前押注者 ...中间有条金色拉链,上面是稍微肥点的怎么搭配外套和里衣 仿照课文生命 生命写一篇作文 要写3件事,380字左右. 如何在微信上面创建一个微信号? 东安黑豹股份有限公司公司简介 2022励志句子精选10句 自信的生命最美丽 梦幻模拟战手游兰迪乌斯转职攻略:兰迪乌斯转职选择推荐 快速排序的时间复杂度是多少 5. 快速排序在平均情况下的时间复杂度为_______________,在最坏情况下的时 间复杂度为________________。 冬天车门关不上有啥好办法 对于那个排序技术中的快速排序法,在最坏的情况下是O(Nlog2N),这个o是什么,还有能解释一下这个数据是 车门冻了锁不上怎么办 为什么快速排序最坏情况下时间效率是n^2,而比较次数是n(n-1)&#47;2,两个的意思不一样嘛,我不懂 冬天车门冻了关不上怎么办 快速排序的时间复杂度在最坏情况下是多少? 车门冻住了,拉几下开了后锁不上了,上车锁坏了吗? 写出冒泡排序选择排序插入排序归并排序快速排序在最坏最坏及平均情况下的时间复杂度 快速排序方法的最坏最好情况是什么,简要分析说明理由. 如何修改快速排序算法,使它在最坏情况下的计算时间为O(nlog n) 谁能给份快速排序的代码? 快速排序算法的示例代码 考虑摩擦力,滑滑梯时候是坐着快还是躺着快或者一样快 【急用】滑滑梯英语怎么说? 是滑滑梯 不是滑梯 滑梯是slide这我知道 但是滑滑梯是什么呢~ 一( )滑梯 滑滑梯用什么量词 为什么吃完面包胃就反酸水 我总是反酸水,吃得多就会这样吗 快速排序平均情况和最坏情况下的算法时间复杂度分别为: 平均情况O(nlog(2,n)),最坏情况O(n^2) 平均情况O 试说明如何修改快速排序算法,使它在最坏情况下的计算时间为O(nlogn).执行后有点问题 怎么解决啊 麻烦了哈 天冷宝马车门关不上 国内企业为什么要去国外上市? 在最坏的情况下,下列排序方法中时间复杂度最小的是()A.冒泡排序 B.快速排序 C.插入排序D.堆排序 冬天汽车门把手拉不动怎么回事,打不开车门啊 境外上市需要证监会批准吗 在外国上市和国内上市有什么区别 股票:为什么要在外国上市呢 辣茄子做法 酸辣茄子干怎么做好 摩圣是什么? 关于魔头、魔王、魔神、魔圣、魔魁、魔尊、魔皇等魔的称呼排序。 完美国际狂魔转魔圣要多少级才能转? 扫描发生器的输出波形是什么形状 魔圣 超级保护剂于发动机凝胶有什么区别 扫频振荡信号发生器输出的是什么信号 七大妖圣中,孙悟空为何甘愿居第七? 示波器中水平扫描信号发生器产生的是什 北京魔圣竞游科技有限公司怎么样?