• 快速排序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是对指针进行了交换 )

  • 相关阅读:
    光脚丫学LINQ(025):如何验证DBML和外部映射文件
    使用LINQ to SQL将数据从一个数据库复制到另一个数据库
    用VS2010 C#写DLL文件并且调用(原创)
    linux初识
    Run Only One Copy Of Application
    SQL Server 2008开启远程连接
    用Visual C#做DLL文件
    SQL Server代理服务无法启动的处理方法(转载)
    QTP连接Oracle
    What's AJAX?
  • 原文地址:https://www.cnblogs.com/liangchao/p/2676821.html
Copyright © 2020-2023  润新知