简单排序算法整理及体会

来源:互联网 发布:淘宝包邮退货邮费规则 编辑:程序博客网 时间:2024/06/05 15:38

    以下主要是在看《啊哈!算法》时,看到的一些简单排序算法,整理一下,免得又忘了。

因为代码是自己写的,没有经过任何测试。。。


1.桶排序:好吧,这里是阉割版的简单桶排序,估计是为了让读者建立信心吧,因为从代码上来看,原来这么容易。先上代码:

    int a[5] = { 6, 8, 2, 9, 4};    int book[10];    for (int i = 0; i < 10; i++) {        book[i] = 0;    }        for (int i = 0; i < 5; i++) {        int j = a[i];        book[j]++;    }        for (int i = 0; i < 10; i++) {        if (book[i] != 0) {            cout << i << endl;        }    }

    一说到排序,第一反应就是在数组的基础上,把最小的排左边啊,然后第二小的啊,看了桶排序,真真切切的感觉到,原来电脑的空间上很大的,偶尔申请几个数组,真的无所谓,合理区间内,该用就用。


2.冒泡排序:基本上说排序的第一反应了,原来也是一个整理好的算法,先上代码:

    int a[5] = {2, 5, 8, 9, 10};        for (int i = 5; i > 0; i--) {        for (int j = 1; j < i; j++) {            if (a[j-1] < a[j]) {                int nTmp = a[j];                a[j] = a[j-1];                a[j-1] = nTmp;            }        }                for (int j = 0; j < 5; j++) {            cout << a[j] << " ";        }        cout << endl;    }        cout << "结果" << endl;    for (int j = 0; j < 5; j++) {        cout << a[j] << " ";    }    cout << endl;

冒泡排序这个算法,可以说对我来讲是记忆犹新的一个算法了。对,没错,面试的时候,无耻的碰上了,然后,崩溃的写垮了!!随着工作时间久了,发现自己当时真的太无知了。不要说算法了,直到最开始上班的时候,才知道有一个大名鼎鼎的mfc!!原来,窗口跟控制台,只差一个MFC。不过说到无知,貌似记得刚毕业去面试的时候,更无知,面试官问了半天问题,结果我用一句话都怼回去了“我不会,但是我肯定没问题!”,“呵呵”。


3.快速排序:太出名了,第一次看到快速排序的示例动态图时,真的是,太高端了,太炫了,下面是个人写的:

void QuickSort(int* arg, int nBegin, int nEnd){    if (nBegin > nEnd) {        return;    }    int nIndex = nBegin;    int nLast = nEnd;    int nTmp = arg[nBegin];        while (nBegin != nEnd) {                        if (arg[nEnd] >= nTmp) {                nEnd--;                continue;            }                        if (arg[nBegin] <= nTmp) {                nBegin++;                continue;            }                        int x = arg[nEnd];            arg[nEnd] = arg[nBegin];            arg[nBegin] = x;        }            arg[nIndex] = arg[nEnd];        arg[nEnd] = nTmp;        for (int j = 0; j < 10; j++) {        cout << arg[j] << " ";    }    cout << endl;        QuickSort(arg, nIndex, nBegin-1);    QuickSort(arg, nBegin+1, nLast);}

一直觉得,常用的这些代码,应该靠理解来记忆,但是,像快速排序这种的,我只能说:背下来!递归哦,终于看到活的递归了。

4.深度优先搜索(DFS):终于逃出了饶来绕去的算法了,把深度优先搜索和前面的排序算法一比:我总是有一种面相对象和面向过程对比的感觉,我觉得,这是思考上的改变,嗯,根本性的,上代码:

void dfs(int step){if (step == n+1){for (int i = 1; i <= n; ++i){cout << a[i] << " ";}cout << endl;}for (int i = 1; i <= n; ++i){if (book[i] == 0){a[step] = i;book[i]++;dfs(step+1);book[i]--;}}return;}
深度优先搜索:主要的思维逻辑就是:a.什么时候结束b.当前步骤干什么 c.下一步重复

至于与深度优先搜索同步的广度优先搜索(BFS),也主要是利用了类似层序遍历的方式进行的,用一个队列,各种插入各种取出。我没写,就不贴了。


5.寻找多数元素(主元素问题):数组中,某个数是超过50%的,找出来。

这个主要的原理是:如果一个数组,有某数超过50%,那么从数组中,随便拿出来2个不一样的数字,那么剩下的数组,超过50%的,肯定还是原来那个。不会变的,因为是拿出来了2个不一样的数字!!


曾经也各种鄙视过,面试的时候,问这些破算法有什么用,业务代码毛用没有,但是随着工作期间各种遭遇,愈发觉得,算法与数据结构,的确是程序的灵魂,在理解的基础上,能背就背下来吧……就好比最简单的swap(int& a, int&b ),之前每次都要想一下,具体怎么操作才能互换,后来,直接背下来了,时间是有限的,节省一点是一点啊!


最后要吐槽一下《啊哈》,里面的数组都是从1开始算起,对于习惯了从0开始的人,有时候,真有点乱!

0 0
原创粉丝点击