在一个无序的序列中,要查找第i小的元素最简单的方法就是将所有元素排序,就可以直接找到地i小的元素,然而比较排序算法最快也只能是O(nlogn),比如堆排序、归并排序、快速排序。这里研究了只要时间复杂度为O(n)的算法。
利用快速排序算法中的枢轴元素,即枢轴元素的左边全是小于等于它的元素,枢轴元素的右边全是大于等于它的元素,则枢轴元素的位置k就是它在序列中第k小的元素,然后用k和要查找的i比较判断即可。这里用到了分治算法,每次递归调用都可以排除掉部分元素:枢轴元素的全部左部分元素或枢轴元素的全部右部分元素。这样使时间复杂度降低到了O(n)。
#include <stdio.h>
int Partition(int A[], int low, int high);
int Find_imin(int A[], int length, int i);
int Findi(int A[], int low, int high, int i);
int main(int argc, char *argv[])
{
int i = 0;
int imin = 0;
int A[] = {5, 2, 4, 6, 1, 3, 9, 10, 8, 7};
int length = sizeof(A) / sizeof(A[0]);
imin = 7;
int result = Find_imin(A, length, imin);
printf("the %d min elements is %d\n", imin, re