锦标赛排序

算法原理与阐述略

这个算法如果从比赛的角度考虑,那么能够理解还是很容易得,但是要是和计算机算法联系起来,就不那么容易理解了。

但好在算法的入口参数还是与其它排序算法没有什么改变,所以,just do it。

————————————————————————————————————

//sort.c

//tournament sort alg, attach space is 2 times than array to being sorted

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define maxValue 30000

int player(int i, int n)

{

    if (0==i%2&&i<2*n-1)

    {

        return i+1;

    }

    else if (1<i)

    {

        return i-1;

    }

}

int winner(int A[], int i, int j, int n)

{

    int u = i>=n?i:A[i];

    int v = j>=n?j:A[j];

    if (A[u]<=A[v])

    {

        return u;

    }

    else

    {

        return v;

    }

}

void createWinTree(int A[], int v[], int n, int* value)

{

    int i, j, k;

    for(i=0; i<n; i++)

    {

        A[n+i] = v[i];

    }

    for(i=2*n-1; i>1; i-=2)

    {

        j = player(i, n);

        k = i/2;

        A[k] = winner(A, i, j, n);

    }

    *value = A[A[1]];

    A[A[1]] = maxValue;

}

void reCreateWinTree(int A[], int n, int* value)

{

    int i = A[1], j, k;

    while (i>1)

    {

        j = player(i, n);

        k = i/2;

        A[k] = winner(A, i, j, n);

        i = k;

    }

    *value = A[A[1]];

    A[A[1]] = maxValue;

}

void tournamentsort(int A[], int arr[], int n)

{

    int value;

    createWinTree(A, arr, n, &value);

    for(int i=0; i<n; i++)

    {

        arr[i] = value;

        reCreateWinTree(A, n, &value);

    }

}

void main()

{

    int arr[] = {99, 21, 13, 15, 54, 32, 44, 27, 68, 88, 76, 89};

    int len = sizeof(arr)/sizeof(int);

    int *A = (int*)malloc(len*2*sizeof(int));

    tournamentsort(A, arr, len);

    for(int i=0; i<len; i++)

    {

        printf("%d ", arr[i]);

    }

    printf(" ");

    free(A);

}

Finally:

越发感觉到,当年算法从无到有产生的过程中,大牛们都经历了怎样的纠结与尝试: 瞻前顾后,有一步退一步,左看看右看看,什么时候该冒进了,什么时候该保守了,得有分寸和取舍,所谓运筹帷幄,其实大多数都代表未到终点的谨慎而已,请记住这句话,对于你分析历史上的文理政经大牛和重大历史事件中,都是举足轻重的方法论;对于你去正确认识理论,实践理论也有绝对的指导意义!!!!

所以,如果一群人(>=2)翻着资料去讨论一个算法问题,我觉得是正常现象,反之,如果有人拿着算法经验的熟悉程序去表现算法给你看给你听的话,那我想他就应该去学学真理是什么?该如何正真做事才是合理得过程。

温习算法的体验与感受:总觉得就自己就像小年轻一下,哆哆嗦嗦,得得瑟瑟,好在年龄已到,所以,我又能自我恢复平静。现在,我彻底理解年轻人的所谓精力和饱满的感受了,“那是因为对于不能理所当然消化和永远拥有的事务的渴望与一知半解的兴奋带来的对未来的憧憬中,自然而然的表现。”故而,还是那句话,人类历史长河中的真正大牛很少很少!并且,那些大牛都得沉浸在谦虚与谨慎之中,所以才出了真成绩。

警示:

如果大家都得得瑟瑟,那么,我们还是把已有的东西拿来用到极致,为社会生产添砖加瓦,为国为民做点实事。装逼就大可不必了!!!

对于面试:我觉得提问者和作答者应该平等拥有相同资料,共同探讨理论的实现过程,如果被考核者能够正确寻找到这个理论的正确来由与过程,我想,他应该比你要强,尤其在你们初次接触的层面来说,如果他的作答有60分的话,我想他就应该是你要找的人!!!!。除开这个的其它一切形式都是当今的八股文,它的弊端请自行搜索相关文献(八股文)。历史上能考过八股夺得官名的又有几人取得过杰出成绩!

原文地址:https://www.cnblogs.com/woodzcl/p/8044446.html