zoukankan      html  css  js  c++  java
  • 常用排序算法的实现和复杂度的分析

    在排序算法的面试中,面试官喜欢考察的就是插入排序、冒泡排序、归并排序、快速排序这四种排序算法,其中快速排序一般会要求现场写代码,这个要注意一下。

    这些算法的考察点就是要对算法的特点烂熟于胸,熟悉它们各自的空间复杂度、平均时间复杂度、最差时间复杂度。别的不多说,先来写一个快速排序的代码实现:

    快速排序代码实现

    快速排序的第一步就是划分,然后才是递归的调用,这里还是按照一般算法的设计步骤,先说算法的设计方案。

    先把pivot轴元素选定出来,然后放到最后。设置一个small指针,这个指针表示两部分数组的边界,small左边的数据都是小于pivot元素,small右边到当前指针index之间的数据都大于pivot。这样遍历一遍,然后把pivot放到指定的位置。

    首先写一个选pivot轴的函数,这个轴是一个随机的选择:

    int RandomInRange(int min, int max)
    {
        int random = rand() % (max - min + 1) + min;
     
        return random;
    }
    

      这个函数在[min,max]之间随机产生一个数字,然后把这个数组返回。

    然后看一下划分函数的写法:

    int Partition(int data[], int start, int end)
    {
    	if(data == NULL)
    		return -1;
        int index = RandomInRange(start, end);
        int small = start - 1;
     
        swap(data[index], data[end]);
     
        for(index = start; index < end; index++)
        {
            if(data[index] < data[end])
            {
                ++small;
                if(small != index)
                {
                    swap(data[small], data[index]);
                }//if
            }//if
        }//for
     
        ++small;
        swap(data[small], data[end]);
     
        return small;
    }//Partition()
    

      

    QuickSort算法就是基于划分的,利用分治算法,先把其中的一个元素归位,然后在分别处理这个元素的左右两边的数组元素。

    void QuickSort(int data[], int start, int end)
    {
        if(start == end)
            return;
     
        int index = Partition(data, start, end);
     
        if(index > start)
            QuickSort(data, start, index - 1);
      if(index < end)
         QuickSort(data, index + 1, end);
    }
    

      

  • 相关阅读:
    线程池中的scheduleAtFixedRate scheduleWithFixedDelay区别
    几道MySQL问题
    【SQL server 2012】复制数据库到另一台机器上
    LeetCode 98. 验证二叉搜索树
    深度学习知识点
    Graph Network Notes
    剑指 Offer 33. 二叉搜索树的后序遍历序列
    剑指 Offer 29. 顺时针打印矩阵
    LeetCode 54. 螺旋矩阵
    LeetCode 50. Pow(x, n)
  • 原文地址:https://www.cnblogs.com/stemon/p/3375875.html
Copyright © 2011-2022 走看看