
- 寻找一个序列中第k小元素
- 【问题描述】
- 【算法详解】
- 【Partition算法】
- 【完整代码】
- 【运行结果】
对于一个包含n个元素的无序序列,请应用分治策略实现寻找序列中第k(1≤k≤n)小元素的算法,要求算法的平均运行时间复杂度是O(n)。
【算法详解】利用分治法求解,类似于快速排序。将数据存放在数组a[0…n-1]中,递增排序,第k小的元素为 a[k-1] 。
按照快速排序思想,利用 Partition 算法进行划分分解,递归地求解a[s…i-1]和a[i+1…t]两个子问题。
情形1:如果数组中只有一个元素且为所求第k小元素,那么返回a[k-1]。
情形2:若k-1=i,a[i]即为所求,返回a[i]。
情形3:若k-1 中求解并返回其结果。
情形4:若k-1>i,第k小的元素应在a[i+1…t]子序列中,递归在该子序列
中求解并返回其结果。
int Partition(int a[], int s, int t)
{
int i = s, j = t;
int temp = a[s];
while (i != j)
{
while (j > i&&a[j] >= temp)
j--;
a[i] = a[j];
while (i < j&&a[i] <= temp)
i++;
a[j] = a[i];
}
a[i] = temp;
}
【完整代码】
//寻找一个序列中第k小的元素 #include【运行结果】using namespace std; #define MAXN 15 int Solve(int a[], int s, int t,int k) { //划分算法 int i = s, j = t; int temp = a[s]; if (s < t) { while (i != j) { while (j > i&&a[j] >= temp) j--; a[i] = a[j]; while (i < j&&a[i] <= temp) i++; a[j] = a[i]; } a[i] = temp; //求解 if (k - 1 == i) return a[i]; else if (k - 1 < i) { return Solve(a, s, i - 1, k); } else return Solve(a, i + 1, t, k); } else if (s == t && s == k - 1) return a[k - 1]; } int main() { int n, k; int a[MAXN]; cout << "请输入数组的大小:"; cin >> n; cout << "请依次输入数组数据:"; for (int i = 0; i <= n; i++) cin >> a[i]; cout << "请输入查找第几小的元素:"; cin >> k; cout << "第" << k << "小的元素为:" << Solve(a, 0, n, k) << endl; system("pause"); return 0; }
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)