您的位置:首页 > 其它

求第i小的元素(2)

2016-03-22 16:22 399 查看
算法导论:最坏情况为线性运行的选择算法

#include<iostream>
#include<vector>
using namespace std;

struct Num_Index
{
int m_num;
int m_Index;
Num_Index(){}
Num_Index(int num, int Index)
{
m_num = num;
m_Index = Index;
}
};

void Insertion_sort(vector<Num_Index> &a, int p, int q)
{
for (int j = p + 1; j <= q; ++j)
{
Num_Index key = a[j];
int i = j - 1;
while (i >= p && a[i].m_num > key.m_num)
{
a[i + 1] = a[i];
i = i - 1;
}
a[i + 1] = key;
}
}

int get_mid(vector<Num_Index>&A, int p, int q)
{
if ((q - p + 1) % 2 == 0)
{
if (A[(p + q + 1) / 2].m_num > A[(p + q - 1) / 2].m_num)
return (p + q - 1) / 2;
else
return (p + q + 1) / 2;
}
else
{
return (p + q) / 2;
}
}

int mid_partition(vector<Num_Index>&A, int p, int r)
{
vector<Num_Index>Median;
for (int i = p; i <=r ; i = i + 5)
{
if (i + 4 <= r)
{
Insertion_sort(A, i, i + 4);
Median.push_back(A[(i + i + 4) / 2]);
}
else
{
Insertion_sort(A, i, r);
Median.push_back(A[get_mid(A, i, r)]);
}
}
Insertion_sort(Median, 0, Median.size() - 1);
int mid = get_mid(Median, 0, Median.size() - 1);
return Median[mid].m_Index;
}

int select(vector<Num_Index>&A, int p, int r, int i)
{
if (p == r)
return A[p].m_num;
int q = mid_partition(A, p, r);
int k = q - p + 1;
if (i == k)
{
return A[q].m_num;
}
else if (i < k)
{
return select(A, p, q - 1, i);
}
else return select(A, q + 1, r, i - k);
}

int main()
{
vector<Num_Index>A;
int num;
int i = 0;
while (cin >> num)
{
A.push_back(Num_Index(num,i));
++i;
}
int numSelect = select(A, 0, A.size() - 1, 5);
cout << numSelect << endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法导论