求第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;
}
#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;
}
相关文章推荐
- java算法导论之FloydWarshall算法实现代码
- MIT Introduction to Algorithms 学习笔记(一)
- MIT Introduction to Algorithms 学习笔记(二)
- MIT Introduction to Algorithms 学习笔记(三)
- MIT Introduction to Algorithms 学习笔记(四)
- MIT Introduction to Algorithms 学习笔记(五)
- MIT Introduction to Algorithms 学习笔记(六)
- MIT Introduction to Algorithms 学习笔记(七)
- MIT Introduction to Algorithms 学习笔记(八)
- MIT Introduction to Algorithms 学习笔记(九)
- MIT Introduction to Algorithms 学习笔记(十)
- 堆排序/优先级队列
- Red-Black Tree 的Java实现
- 逆序对
- 算法导论之堆
- LCS 最长公共子序列
- 使用Java完成《算法导论》习题2.2-2
- 使用Java完成《算法导论》习题2.3-2
- 使用Java完成《算法导论》习题2.3-4
- 使用Java完成《算法导论》习题2.3-5