日期:2019/4/10 wpx
被问到的问题:
1.自我介绍
2.为什么辞职?
3.懂哪些排序算法? 冒泡、选择、快排、插入
4.解释一下快速排序? 根据任一被选取的数据,降比他小的数据放他左边,大的放其右,重复这个过程。
5.这些算法的时间复杂度? 冒泡、选择、插入 最好情况都是O(N)快排最好O(n*log2n) 最差都是O(N2
算法 | 最好时间 | 最差时间 | 平均 | 是否稳定 |
冒泡 | O(N) | O(N2 | O(n2) | 是 |
选择 | O(N) | O(N2 | O(n2) | 是 |
插入 | O(N) | O(N2 | O(n2) | 是 |
快速 | O(n*log2n) | O(N2 | O(n*log2n) | 否 |
6.手写快速排序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace test
{
class QuickSort
{
static void Main(string[] args)
{
int[] array = { 49, 38, 65, 97, 76, 13, 27 };
sort(array, 0, array.Length - 1);
Console.ReadLine();
}
/**一次排序单元,完成此方法,key左边都比key小,key右边都比key大。
private static int sortUnit(int[] array, int low, int high)
{
int key = array[low];
while (low < high)
{
/*从后向前搜索比key小的值*/
while (array[high] >= key && high > low)
--high;
/*比key小的放左边*/
array[low] = array[high];
/*从前向后搜索比key大的值,比key大的放右边*/
while (array[low] <= key && high > low)
++low;
/*比key大的放右边*/
array[high] = array[low];
}
/*左边都比key小,右边都比key大。//将key放在游标当前位置。//此时low等于high */
array[low] = key;
foreach (int i in array)
{
Console.Write("{0}\t", i);
}
Console.WriteLine();
return high;
}
/**快速排序
*@paramarry
*@return */
public static void sort(int[] array, int low, int high)
{
if (low >= high)
return;
/*完成一次单元排序*/
int index = sortUnit(array, low, high);
/*对左边单元进行排序*/
sort(array, low, index - 1);
/*对右边单元进行排序*/
sort(array, index + 1, high);
}
}
}
7.A*寻路算法是如何实现?
核心公式:F=G+H
F - 方块的总移动代价
G - 开始点到当前方块的移动代价(拓展: G = 移动代价 * 代价因子)
H - 当前方块到结束点的预估移动代价(即为当前点到结束点的曼哈顿距离)
A星算法还需要用到两个列表:
开放列表 - 用于记录所有可考虑选择的格子
封闭列表 - 用于记录所有不再考虑的格子
提前将寻路区域分为若干网格,计入障碍物代表网格,在确定了寻路的开始点,结束点的情况下,假定每个方块都有一个F值,该值代表了在当前路线下选择走该方块的代价。
而A星寻路的思路很简单:从开始点,每走一步都选择代价最小的格子走,直到达到结束点。
A星算法伪码:
a、将开始点记录为当前点P
b、将当前点P放入封闭列表
c、搜寻点P所有邻近点,假如某邻近点既没有在开放列表或封闭列表里面,则计算出该邻近点的F值,并设父节点为P,然后将其放入开放列表
d、判断开放列表是否已经空了,如果没有说明在达到结束点前已经找完了所有可能的路径点,寻路失败,算法结束;否则继续。
e、从开放列表拿出一个F值最小的点,作为寻路路径的下一步。
f、判断该点是否为结束点,如果是,则寻路成功,算法结束;否则继续。
g、将该点设为当前点P,跳回步骤c。