算法分析与设计实验-作业6-选最小k元素

1. 问题

找出一组元素中第k小的元素并输出。

2. 解析

算法分析与设计实验-作业6-选最小k元素_第1张图片
算法分析与设计实验-作业6-选最小k元素_第2张图片
算法分析与设计实验-作业6-选最小k元素_第3张图片

3. 设计

int divisionRecursion(int a[], int n, int k)
{
	if (n <= 6)
	{
		sort(a, n);
		return a[k - 1];
	}
	else
	{
		int b[10], c[10], d[50];
		int i = 0, j = 0, t = 0;
		while (i < n)
		{
			b[j++] = a[i++];
			if (i % 5 == 0 | i == n)
			{
				sort(b, j);
				c[t++] = b[j / 2];
				j = 0;
			}
		}
		sort(c, t);
		if (k == localData(a, c[t / 2]))
			return c[t / 2];
		else if (k < localData(a, c[t / 2]))
		{
			int i = 0, j = 0;
			while (i < n)
			{
				if (a[i] < c[t / 2])
					d[j++] = a[i];
				i++;
			}
			n = j;
			copyData(a, d, j);
			return divisionRecursion(a, n, k);
		}
		else
		{
			int i = 0, j = 0;
			while (i < n) {
				if (a[i] > c[t / 2])
					d[j++] = a[i];
				i++;
			}
			k = k - n + j;
			n = j;
			copyData(a, d, j);
			return divisionRecursion(a, n, k);
		}
	}
}

4. 分析

分治算法的时间复杂度是O(n)。

5. 源码

https://github.com/kekekeQWQ/6

你可能感兴趣的:(算法分析与设计实验-作业6-选最小k元素)