算法学习:找到数组中的第k小元素

问题描述:
给出数组的起点序号和终点序号,找出这个数组序列中第k小的元素。问题来自陈玉福老师的讲义,代码如下:

#include
using namespace std;

int Partion(int p,int q, int *num)
{
    int i = p + 1;
    int j = q;


    while(i <= j)//**修改地方
    {
        while(num[i] <= num[p] && i < q)
        {
            i++;
        }
        while(num[j] > num[p] && j >= p)
        {
            j--;
        }
        if(i < j)
        {
            swap(num[i], num[j]);
        }

    }
    swap(num[p], num[j]);
    return j;
}

int partselect(int *num, int k, int l, int r)
{
    k = k + l - 1;
    while(1)
    {
        int j = Partion(l, r, num);
        if(k == j)
        {
            return num[k];
        }
        else if(k > j)
        {
            l = j + 1;
        }
        else
        {
            r = j;
        }
    }
}

int main()
{
    int num[6] = {1,2,3,4,5,6};
    int r = partselect(num,3,1,4);
    cout << r << endl;
    return 0;
}

跟快速排序一样,这里用到了划分函数Partion,但是刚开始直接将上面的那个函数代码粘贴过来程序并不能正常运行,后来单步调试发现是循环中改动了一个条件,已经在程序中注明。
所以呢,之前写的快排的程序应该也是少了一个=,去改~~~

你可能感兴趣的:(算法入门学习,算法入门)