排序算法回顾
– 在18年11月2日的百度大厦K2,一个文库面试官在二面时问了我一个我刚毕业时都觉得很简单的算法题,给我写个XXX,用递归写吧。我记得已经几年没有在面试中问到这样的算法了,无独有偶,在18年11月加入百度的时候,在百度大厦,面试官问了我一个快速排序的题。这让我一下子不太懂套路了,我说:“我已经好几年没有写排序算法了,我能先了解一下这个排序什么意思?”,这段经历让我怀疑自己。所谓面试还是得从基础开始,所以在那个面试官的提示下,我也完成了几道算法题和一些设计模式问题。在后来的整一年时间,虽然进入公司,但我一直在思索我是不是应该捡一下数据结构和基础算法。再后来我开始刷leecode了。
– 所以那些年我很感谢百度对我的培养,包括在百度地图、在百度搜索公司,关于百度的一套开发流程到一些惯用的工具,包括icode、内搜、wiki、icafe和持续集成平台再到AP框架、laravel框架、NMQ,都有所了解,并将一部分大学时学的shell进行了实践。感谢那些年百度培养了不太懂排序的我。T7面试的时候我竟然觉得wget是“拉流”,狭义上讲的流式数据并不是那个意思,是相对于批处理而言的。
桶排序
#include <stdio.h>
int main()
{
int a[11], i, j, t;
for (i=0; i<=10; i++)
{
// 初始化为0
a[i] = 0;
}
for (i=1; i<=5; i++)
{
// 在这里输入5个待排序数字
scanf("%d", &t);
// 表示已经有数据t n次了
a[t]++;
}
// 遍历a数组,升序
for (i=0; i<=10; i++)
{
// 如果i在a中出现过,那么就打印这个下标几次
for (j=1; j<=a[i]; j++)
{
printf("%d", i);
}
}
// 遍历a数组,降序
for (i=10; i>=0; i--)
{
for (j=1; j<=a[i]; j++)
{
printf("%d", i);
}
}
return 0;
}
快速排序
#include <stdio.h>
void quicksort(int left, int right)
{
int i, j, t, temp;
if (left > right)
{
return;
}
temp = a[left];
i = left;
j = right;
while (i != j)
{
// 顺序
while (a[j] >= temp && i < j)
{
i++;
}
// 交换两个数在数组中的位置
if (i < j)
{
t = a[i];
a[i] = a[j];
a[j] = t;
}
}
// 最终将基准数归位
a[left] = a[i];
a[i] = temp;
quicksort(left, i - 1);
quicksort(i + 1, right);
return;
}
int main()
{
int i, j;
// 读入数据
scanf("%d", &n);
for(i=1; i<=n; i++)
{
printf("%d ", &a[i]);
}
quicksort(1, n);
// 输入排序后的结果
for(i=1; i<=n; i++)
{
printf("%d ", a[i]);
}
return 0;
}