poj2388 堆排序和快排的练手

来源:互联网 发布:mac mini好用吗 编辑:程序博客网 时间:2024/05/19 11:38

就是排序后求中位数,直接调用sort就行,这里我手写堆排序和快排练练手。
堆排序:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int a[100005], num;int n;int parent(int i){    return i / 2;}int leftson(int i){    return 2 * i;}int rightson(int i){    return 2 * i + 1;}void swapit(int t1, int t2){    int t = a[t1];    a[t1] = a[t2];    a[t2] = t;}void maxheapify(int i){    int l, r, maxnum;    l = leftson(i);    r = rightson(i);    maxnum = i;    if(l <= num && a[l] > a[i])        maxnum = l;    if(r <= num && a[r] > a[maxnum])        maxnum = r;    if(maxnum != i)    {        swapit(maxnum, i);        maxheapify(maxnum);    }    return ;}void buildmaxheap(){    num = n;    for(int i = n / 2; i >= 1; -- i)        maxheapify(i);}void heapsort(){    buildmaxheap();    for(int i = n; i >= 2; -- i)    {        swapit(1, i);        num--;        maxheapify(1);    }}int main(){    cin >> n;    for(int i = 1; i <= n; ++ i)        cin >> a[i];    heapsort();    cout << a[n / 2 + 1] << endl;    return 0;}

快排

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int a[100005], n;int partnum(int l, int r){    int x = a[r];    int i = l - 1;    for(int j = l; j <= r - 1; ++ j)    {        if(a[j] <= x)        {            i++;            swap(a[i], a[j]);        }    }    swap(a[i + 1], a[r]);    return i + 1;}void quicksort(int l, int r){    if(l < r)    {        int t = partnum(l, r);        quicksort(l, t - 1);        quicksort(t + 1, r);    }}int main(){    cin >> n;    for(int i = 1; i <= n; ++ i)        cin >> a[i];    quicksort(1, n);    cout << a[n / 2 + 1] << endl;    return 0;}
1 0
原创粉丝点击