【比较难写的算法】最坏情况线性时间的选择
发布网友
发布时间: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分的得分内存测试中心重点内容,读者应该还记得,时间复杂度和空间复杂度的概念。 算法时间复杂度的算法的时间复杂度是实现算法所需的计算工作。 />在不同...
如何计算时间复杂度
三、考虑最坏和平均情况 在计算时间复杂度时,我们需要考虑最坏的情况和平均情况。最坏情况下的时间复杂度最能反映算法性能的上限,因为它确保在所有情况下都能满足一定的性能要求。同时,平均情况下的时间复杂度也很重要,因为它提供了算法的预期性能。在进行时间复杂度分析时,通常需要考虑到这两者。一般...
紧急!!!有什么排序方法?各有什么特点?
(1)冒泡排序 简单,时间复杂度O(n^2)(2)插入排序 简单,比冒泡难写,时间复杂度O(n^2),通常比冒泡快(3)快速排序 稍难,平均O(nlogn),最坏O(n^2)(4)选择排序 简单 O(n^2)(5)归并排序 使用了递归算法(6)堆排序 O(nlogn),时间很稳定(7)计数排序 线性时间排序算法,不过要求数据种类少常见的排序...
我是湖南邵阳职业技术学院的专科学生,学的是计算机科学与技术,然后明 ...
1) 算法的描述和分析:算法的时间复杂度和空间复杂度、最坏的和平均的时间复杂度第二章 线性表一、学习目的和要求本章的目的是介绍线性表的逻辑结构和各种存储表示方法,以及定义在逻辑结构上的各种基本运算及其在存储结构上如何实现这些基本运算。要求在熟悉这些内容的基础上,能够针对具体应用问题的要求和性质,选择合适...