前言
最近正在准备找工作,那些与编程相关的职位都是需要直接考察编程技能的,作为非计算机专业却又得硬着头皮去应聘的我来说,确实是个挑战。不过编程面试的好处就是,不用多说废话,行不行直接看代码,写出来什么就是什么,若是被鄙视,也是实力不济,没什么好说的。
对于一些基础的核心的算法或者数据结构的实现,之前经历了淘宝华为的笔试面试,总之就是光懂是不行的,还得很熟练的写出来,或许一些比较复杂的问题可以跟面试官聊聊思路,但对于基础性的问题,是要能够熟练回答的,一般都是直接拿纸笔写,若基础问题过不了关,也没有继续下去的资格了。刚好,拿这个博客来练手,并整理收集一些基础的题目。作为一个菜鸟,道路很艰巨哪,时间也很紧促呀。
问题
快速排序的实现
对于快速排序,很多教材上都说得很清楚了,或者上网查询一下也很容易找到完整的描述。但我就不在这里copy一遍了,最重要的还是自己能够理解到什么样的程度,以及能否实现出来,所以这里就只用自己的理解写点不那么专业的文字。
快速排序在每一次的递归过程中所做的,就是从数组中选取一个基准数,然后对数组进行重新排,把小于该基准数的元素放在该基准数的左边,大于该基准数的元素放在该基准数的右边(若要求对数组进行递增排序的话)。
small1 small2 small3 small4 middle large1 large2 large3 large4
较简单的一种实现方法是(C语言)
/*首先实现一个数组元素交换的函数*/
void swap( int s[], int i, int j )
{
int temp;
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
/*快速排序*/
void quicksort( int s[], int left, int right ) /*left为数组最左边的元素位置(0),right为数组最右边的元素位置(length - 1)*/
{
int i;
int last = left; /*这里的last是用来标记基准值在数组中所处位置的,即最终last之前的元素都小于基准值,last之后的值都大于基准值,s[last] == 基准值*/
if( left >= right )
return;
for( i = left + 1; i <= right; i++)
{
if( s[i] < s[left] ) /*以起始元素s[left]为基准值*/
{
last++; /*从left + 1位置开始*/
swap( s, last, i );
}
} /*最终数组中left + 1 ~ last的元素都是小于s[left]的*/
swap( s, last, left ) /*让基准值处在最终标记的位置*/
quicksort( s, last + 1, right ); /*通过递归调用,对分隔出来的两个子数组再进行排序*/
quicksort( s, left, last - 1 );
}
上面这个实现出处是《C程序设计语言》这本书( 不完全一样,书里面swap是对指针进行了交换 )