• 排序算法——快速排序


      快速排序同样是一种交换排序,在以往的互联网求职面试过程中,经常有面试官让手写快排的算法,这属于最基本的知识,我们一定要烂熟于心。

      首先来了解一下快排是怎么一回事:假设给定了一个序列,将序列的第一个元素(或者任意元素都行)作为基准,首先从后向前扫描序列,遇到比基

    准小的元素,将其交换到基准的前面;然后从前向后扫描序列,遇到比基准大的元素,将其交换到基准的后面。这样一趟排序完成后,基准的左侧都是

    比其小的元素,基准右侧都是比其大的元素,也就是说这个基准将给定的序列分为了两子序列。注意,这只是一趟排序的结果,我们再对子序列运用同

    样的操作,因此,可以采用递归的方式。

      算法实现如下:

    #include <stdlib.h>
    #include <stdio.h>
    
    void QuickSort(int A[], int s, int t)
    {
        int i, j, temp;
        i = s;
        j = t;
        if(s == t)                  // 递归结束的条件
            return;
        else
        {
            temp = A[s];            // 选定的基准
            while(i!=j)
            {
                while(i < j && A[j] > temp)     // 从后向前扫描
                    j--;
                A[i] = A[j];                    
                while(i < j && A[i] < temp)
                    i++;
                A[j] = A[i];
            }
            A[i] = temp;            // 当i=j时循环结束,此时i为基准应该插入的位置
            QuickSort(A, s, i-1);   // 递归处理基准左侧的子序列
            QuickSort(A, i+1, t);   // 递归处理基准右侧的子序列
        }
    }

      最坏情况下,快排的时间复杂度为O(n2),空间复杂度为O(log2n)。这里需要注意的就是快排的空间复杂度,已经不是一个常量级的了,至于如何推

    导,请查阅相关的资料。最后,对于算法的稳定性而言,快排是不稳定的。

      这里的稳定性是指:如果给定的序列中有某两个元素相等,那么在排序前后,这两个元素的位置是否变化,如果未变化,则说明该排序算法是稳定的,

    否则,是不稳定的。

  • 相关阅读:
    layui的form.val无法动态渲染赋值表单问题解决方法
    Android studio引入三方sdk运行时报错Cause: invalid opcode ba (invokedynamic requires --min-sdk-version >= 26)
    tp6通过闭包方式连表查询的问题
    android中简单便捷使用GreenDao本地数据库及采坑之路
    Java多线程(一)
    Java集合
    JAVA IO/NIO
    JVM类加载机制
    JVM垃圾回收与算法
    JVM内存模型
  • 原文地址:https://www.cnblogs.com/greedyco/p/7148355.html
Copyright © 2020-2023  润新知