几种有关排序的常见面试问题

1、荷兰国旗问题

题目描述:现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右,依次是一些红球、一些白球、一些蓝球。



分析与解法:

初看此题,我们貌似除了暴力解决并无好的办法,但联想到我们所熟知的快速排序算法呢?

我们知道,快速排序依托于一个partition分治过程,在每一趟排序的过程中,选取的主元都会把整个数组排列成一大一小的部分,那我们是否可以借鉴partition过程设定三个指针完成重新排列,使得所有球排列成三个不同颜色的球呢?



解法:

通过前面的分析得知,这个问题类似快排中partition过程,只是需要用到三个指针:一个前指针begin,一个中指针current,一个后指针end,current指针遍历整个数组序列,当

1.current指针所指元素为0时,与begin指针所指的元素交换,而后current++,begin++ ;
2.current指针所指元素为1时,不做任何交换(即球不动),而后current++ ;
3.current指针所指元素为2时,与end指针所指的元素交换,而后,current指针不动,end– 。

为什么上述第3点中,current指针所指元素为2时,与end指针所指元素交换之后,current指针不能动呢?因为第三步中current指针所指元素与end指针所指元素交换之前,如果end指针之前指的元素是0,那么与current指针所指元素交换之后,current指针此刻所指的元素是0,此时,current指针能动么?不能动,因为如上述第1点所述,如果current指针所指的元素是0,还得与begin指针所指的元素交换。

ok,说这么多,你可能不甚明了,直接引用下gnuhpc的图,就一目了然了:

参考代码如下:

#include<iostream>
#include<vector>
using namespace std;
class ThreeColor {
public:
    vector<int> sortThreeColor(vector<int> &A, int n)
    {
        int f,r,i,temp;
        for(i=f=0,r=n-1;i<=r;i++)
        {
            if(A[i]==0)
            {
                temp=A[f];
                A[f]=A[i];
                A[i]=temp;
                f++;
            }
            if(A[i]==2)
            {
                temp=A[r];
                A[r]=A[i];
                A[i]=temp;
                r--;
                i--;
            }
        }
        return A;
    }
};
int main()
{
    int a[6]={1,2,0,2};
    vector<int> b(a,a+4);
    ThreeColor c;
    c.sortThreeColor(b,4);
    for(int i=0;i<4;i++)
        cout<<b[i]<<" ";
    cout<<endl;
    return 0;
}


2、求需要排序的最短子数组长度

题目描述:
假设数组为a b c d e f g h i j k l m n,

如果abc是有序的,mn是有序的,至于中间的defghijkl是无序的,我们可以得知,如果是正常升序序列,左边的一定是小于右边的任意数值,右边的一定大于左边的任意数值。



思路:

1、我们从后往前遍历,如果某个元素大于右边最小的元素,就标记,一直遍历到最左边;
2、从前往后遍历,如果某个元素小于左边的最大的元素,则标记,一直遍历到最右边。



参考代码:

#include<iostream>
#include<vector>
using namespace std;
class Subsequence {
public:
    int shortestSubsequence(vector<int> A, int n)
    {
        int max=A[0],min=A[n-1],i,rd1,rd2;
        for(i=1,rd1=0;i<n;i++)
        {
            if(A[i]>=max)
                max=A[i];
            else
                rd1=i;
        }
        for(i=n-2,rd2=n-1;i>=0;i--)
        {
            if(A[i]<=min)
                min=A[i];
            else
                rd2=i;
        }
        if(!rd1)
            return 0;
        else
            return rd1-rd2+1;
    }
};
int main()
{
    int a[6]={1,4,6,5,9,10};
    vector<int> b(a,a+6);
    Subsequence c;
    int d=c.shortestSubsequence(b,6);
    cout<<d<<endl;
    return 0;
}
时间: 2024-10-13 23:07:42

几种有关排序的常见面试问题的相关文章

视觉直观感受 7 种常用排序算法

10月14日发布<统计世界的十大算法>后,很多朋友在后台询问,哪里有"视觉直观感受 7 种常用排序算法",今天分享给大家,感谢todayx.org. 1. 快速排序 介绍: 快速排序是由东尼·霍尔所发展的一种排序算法.在平均状况下,排序 n 个项目要Ο(n log n)次比较.在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见.事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,

七种qsort排序方法

七种qsort排序方法 <本文中排序都是采用的从小到大排序> 一.对int类型数组排序 C/C++ code int num[100]; Sample: int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp); 二.对char类型数组排序(同int类型) C/C++ code char word[100]; Sample: int

关于c++几种简单排序算法的比较次数和移动次数的问题

问题描述 关于c++几种简单排序算法的比较次数和移动次数的问题 排序结果没有问题,可是比较次数和移动次数的计数结果不对.求高人指点. #include<iostream> using namespace std; class Sort { private: int *r; int n; // the number of elements of array int MoveNum; int CompNum; public: void insert(); void bubble(); int ge

PHP 实现四种基本排序算法

PHP 实现四种基本排序算法 许多人都说算法是程序的核心,算法的好坏决定了程序的质量.作为一个初级phper,虽然很少接触到算法方面的东西.但是对于基本的排序算法还是应该掌握的,它是程序开发的必备工具.这里介绍冒泡排序,插入排序,选择排序,快速排序四种基本算法,分析一下算法的思路. (题图来自:robinhoodsplayground.com) 前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序.  $arr(1,43,54,62,21,66,3

Java线程池的几种实现方法及常见问题解答_java

工作中,经常会涉及到线程.比如有些任务,经常会交与线程去异步执行.抑或服务端程序为每个请求单独建立一个线程处理任务.线程之外的,比如我们用的数据库连接.这些创建销毁或者打开关闭的操作,非常影响系统性能.所以,"池"的用处就凸显出来了. 1. 为什么要使用线程池 在3.6.1节介绍的实现方式中,对每个客户都分配一个新的工作线程.当工作线程与客户通信结束,这个线程就被销毁.这种实现方式有以下不足之处: •服务器创建和销毁工作的开销( 包括所花费的时间和系统资源 )很大.这一项不用解释,可以

JAVA四种基本排序方法实例总结_javascript技巧

本文实例讲述了JAVA四种基本排序方法.分享给大家供大家参考.具体如下: JAVA四种基本排序,包括冒泡法,插入法,选择法,SHELL排序法.其中选择法是冒泡法的改进,SHELL排序法是 插入法的改进.所以从根本上来说可以归纳为两种不同的排序方法:即:插入法&冒泡法 一 插入法: 遍历排序集合,每到一个元素时,都要将这个元素与所有它之前的元素遍历比较一遍,让符合排序顺序的元素挨个移动到当前范围内它最应该出现的位置.交换是相邻遍历移动,双重循环控制实现.这种排序法属于地头蛇类型,在我的地牌上我要把

基于python的七种经典排序算法(推荐)_python

一.排序的基本概念和分类 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法. 排序的稳定性: 经过某种排序后,如果两个记录序号同等,且两者在原无序记录中的先后秩序依然保持不变,则称所使用的排序方法是稳定的,反之是不稳定的. 内排序和外排序 内排序:排序过程中,待排序的所有记录全部放在内存中 外排序:排序过程中,使用到了外部存储. 通常讨论的都是内排序. 影响内排序算法性能的三个因素: 时间复杂度:即时间性能,高效

php四种基础排序算法的运行时间比较

/**  * php四种基础排序算法的运行时间比较  * @authors Jesse (jesse152@163.com)  * @date    2016-08-11 07:12:14  */ //冒泡排序法 function bubbleSort($array){     $temp = 0;     for($i = 0;$i < count($array) -1;$i++){         for($j = 0;$j < count($array) - 1 -$i;$j++){  

几种经典排序算法的JS实现方法_基础知识

一.冒泡排序 function BubbleSort(array) { var length = array.length; for (var i = length - 1; i > 0; i--) { //用于缩小范围 for (var j = 0; j < i; j++) { //在范围内进行冒泡,在此范围内最大的一个将冒到最后面 if (array[j] > array[j+1]) { var temp = array[j]; array[j] = array[j+1]; arra