快速排序C语言

前言

    最近正在准备找工作,那些与编程相关的职位都是需要直接考察编程技能的,作为非计算机专业却又得硬着头皮去应聘的我来说,确实是个挑战。不过编程面试的好处就是,不用多说废话,行不行直接看代码,写出来什么就是什么,若是被鄙视,也是实力不济,没什么好说的。

    对于一些基础的核心的算法或者数据结构的实现,之前经历了淘宝华为的笔试面试,总之就是光懂是不行的,还得很熟练的写出来,或许一些比较复杂的问题可以跟面试官聊聊思路,但对于基础性的问题,是要能够熟练回答的,一般都是直接拿纸笔写,若基础问题过不了关,也没有继续下去的资格了。刚好,拿这个博客来练手,并整理收集一些基础的题目。作为一个菜鸟,道路很艰巨哪,时间也很紧促呀。

问题

快速排序的实现

    对于快速排序,很多教材上都说得很清楚了,或者上网查询一下也很容易找到完整的描述。但我就不在这里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是对指针进行了交换 )

原文地址:https://www.cnblogs.com/liangchao/p/2676821.html