简单排序算法整理及体会

本文介绍了几种常见的简单排序算法,包括桶排序、冒泡排序和快速排序,并提供了代码示例。同时,还涉及了深度优先搜索及寻找多数元素等问题。

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

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


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开始的人,有时候,真有点乱!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值