【求助】算法导论9.3线性时间查找算法
结果与错误,程序也是非正常结束的;
请大侠帮忙修改
请大侠帮忙修改
#include<iostream>
#include<ctime>
#include<iterator>
using namespace std;
int random(int p,int q)
{
time_t t;
srand((unsigned)time(&t));
return rand()%(q-p)+p;
}
int mid(int L,int R)
{
return L+(R-L)/2;
}
void swap(int &a,int&b)
{
int temp=a;
a=b;
b=temp;
}
void randomshuffle(int A[],int L,int R)
{
for(int i=L;i<R;i++)
{
int j=random(i,R);
swap(A[i],A[j]);
}
}
void insertsort(int A[],int L,int R)
{
for(int i=L+1;i<=R;i++)
{
int value=A[i];
int j=i-1;
while(j>=L&&A[j]>value)
{
A[j+1]=A[j];
j--;
}
A[j+1]=value;
}
}
int partition(int A[],int L,int R,int key)
{
//轴值的首尾标志
int leftIndex = L;
int rightIndex = R;
//快速排序的一轮
while (leftIndex < rightIndex)
{
//从右侧开始扫描若右侧数大于轴值则右侧标志位-1
while (leftIndex < rightIndex && A[rightIndex] > key)
{
rightIndex--;
}
//若右侧数小于轴值则交换右侧的数和左侧leftindex所指的数 并从左边开始比较
while (leftIndex < rightIndex && A[rightIndex] < key)
{
swap(A[leftIndex], A[rightIndex]);
leftIndex++;
}
//从左边开始比较若该数小于或等于轴值 则左侧标志位+1 注意一定要注意等于的情况
while (leftIndex < rightIndex && (A[leftIndex] < key || A[leftIndex] == key))
{
leftIndex++;
}
//从左边开始比较若该数比轴值大 则将该数和右侧标志位rightIndex对应的值交换并从右侧开始计算
while (leftIndex < rightIndex && A[leftIndex] > key)
{
swap(A[leftIndex], A[rightIndex]);
rightIndex--;
}
if (leftIndex >= rightIndex)
{
break;
}
}
//求key值对应的索引
return leftIndex;
}
int selete(int A[],int L,int R,int i)
{
if(R-L<5)
{
insertsort(A,L,R);
//cout<<A[L+i-1]<<"***";
return A[L+i-1];
}
int length=R-L+1;
int size=length/5,left,right;
for(int k=0;k<size;k++)
{
//计算每一组的起始索引
left=L+k*5;
//计算每一组的终止索引
right=left+4;
insertsort(A,left,right);
swap(A[L+k],A[left+2]);
}
//求中位数的中位数x
int x=selete(A,L,L+size-1,(size+1)/2);
//将数组分割成两组 返回该pivot的索引值
int M=partition(A,L,R,x);
int K=M-L+1;
//在前半部分 递归前部分
if(i<=K)
{
return selete(A,L,M,i);
}
else//在后半部分递归
{
return selete(A,M+1,R,i-K);
}
}
int main()
{
int A[100];
int i;
for(i=0;i<100;++i)
A[i] = i+1;
randomshuffle(A,0,99);//随机排列,打乱顺序
cout<<"Init A:\n";
copy(A,A+100,ostream_iterator<int>(cout," "));
cout<<endl;
for(i=0;i<100;++i)
{
cout<<i<<" th element: ";
cout<<selete(A,1,100,i)<<endl;
}
cout<<endl;
}
...全文
相关推荐
算法导论 习题答案
**线性搜索算法** - 提供了一个名为`LINEAR-SEARCH`的算法,用于在一个数组中查找指定值\(v\)的位置,如果找不到则返回`nil`。
完整的算法导论习题答案 完整的算法导论习题答案
线性搜索算法**文档提供了一个简单的线性搜索算法示例,用于在一维数组中查找指定值。该算法从数组的第一个元素开始遍历,直到找到目标值或遍历完整个数组。
算法导论第二版答案 算法导论第二版答案 算法导论第二版答案
此外,文档还提供了一个线性搜索算法(LINEAR-SEARCH),用于在一维数组中查找特定值\( v \)的位置。
算法导论 lecture3
3. **Combine(合并):** 使用线性时间的合并操作将排序后的子数组合并为一个有序数组。
十大算法之线性查找算法
"本文主要介绍了线性查找算法,特别是BFPRT算法,这是一种在最坏情况下也能保持线性时间复杂度的寻找第k小(大)元素的算法。此外,还探讨了寻找最小的k个数问题的不同解法,包括排序和非排序策略。"


