面试官上来让说快速排序与堆排(说,不是编),然后让说比较,区别,数据量大的情况下,哪种排序快;
之前记得说快速排序在数据量大的时候,是最快的排序算法(单线程,内部排序算法);
但是面试官说推排快(本人不太了解堆排),然后一直问我,让我说为什么我觉得快速排序排快;(没答上来)
(后来觉得,面试官可能故意说堆排快,让我去反驳,去表现。不然为什么一直追问我,为什么我觉得快速排序排快)
然后撸题:
题目:正负数排序:
给一串无序数组,包含有正负数(不含0);将数组排序成正负交替的数组,不改变原来数组的正数和负数各自的顺序:
若正负元素不等,直接把剩下元素放在数组后面:
例:-1,-3,5,-6,8 输出结果:5,-1,8,-3,-6
面试的时候思路都已经说出来了,设置正负标志位分别指向第一正数或负数,若负数下标-正数下标 !=1;则分情况交换数组;
但是面试的时候特别想快点码出来;结果心态不好,很急;
面试就挂掉了,所以,做题不可以浮躁,一步一步来。题目不难。但是心态很重要;
自己面完后,在下面敲了代码;大概25分钟,但是面试的时候40分钟都没敲出来;希望吸取教训;
最近要狂练代码了;编的少,水平不高!;见得少;让心态不好!
#include <iostream>
using namespace std;
void swap(int *arr,int p)
{
int temp=arr[p-1];
arr[p-1]=arr[p];
arr[p]=temp;
}
void pnsort(int *arr,int size)
{
int p=0;
int n=0;
if (size>1)
while(n<size && p<size)
{
while(arr[p]<0)
p++;
while(arr[n]>0)
n++;
if(p>=size || n>=size)
break;
while(n-p!=1)//如果负下标-正下标==1;满足正负交替,不等于1;需要交换
{
if(n>p)//如果负数下标大,直接交换,并让负下标减一
{
swap(arr,n);
n--;
}
else //如果负数下标小分情况
{
if (p-n==1)//如果正数下标和负数下标相邻,交换正负下标和元素
{
swap(arr,p);
p--;
n++;
}
else //如果正数下标和负数下标不相邻,交换正负下标和元素
{
swap(arr,p);
p--;
}
}
}
n=n+1;//数组前n个数已满足正负交替;比较剩下的元素继续;
p=p+2;
}
}
int main()
{
int arr[10]={-20,-32,12,-32,45,11,21,31,-41,33};
// int arr[3]={-20,-32,-2};
int size=10;
pnsort(arr,size);
int i=0;
while(i<size)
{
cout<<arr[i]<<" ";
i++;
}
cout<<endl;
return 0;
}
最后说一下,我投的日常实习生(不是校招);反馈贼快,前一天t投第二天就通知面试时间,只有四天准备,慌得一批;