应届毕业生面试必备之基本排序算法(原创)
这是博主的第一篇博客,记录一下自己面试过程中如何去回答基础的排算法的知识点的.
对于的排序算法,我们初级程序员(20届应届生),面试中小公司,能说上这5个排序算法,基本就是合格以上水准了
- 冒泡排序
这是初学软件行业的大一新生必会的,可手撸的排序算法 , 比较简单. 面试时候,只用简单说一说通过两次for循环, 比较相邻元素 ,进行位置交换即可.废话不多说上代码解析 :
/**
* 冒泡排序
*
* @param array
* @return
*/
//传个未排序数组,
public static int[] bubbleSort(int[] array) {
if (array.length == 0) {//健壮性判断
return array;}
int temp ;
for (int i = 0; i < array.length; i++)
for (int j = 0; j < array.length - 1 - i; j++)
if (array[j + 1] < array[j]) { //相邻元素比较大小
temp = array[j + 1]; //两两交换
array[j + 1] = array[j];
array[j] = temp;
}
return array; //返回排好序数组
}
- 选择排序
选择排序,面试时候,你只用说"也是通过两层for循环,…通过找到最值,放到起始位置,然后类推找一个,放一个在后面",大概就这意思,用自己白话解释,就可, 上代码
/**- 选择排序
- @param array
- @return
*/
public static int[] selectionSort(int[] array) {
if (array.length == 0){
return array;}
int temp;
int minIndex;
for (int i = 0; i < array.length; i++) {
minIndex = i;
for (int j = i; j < array.length; j++) {
if (array[j] < array[minIndex]) //找到最小的数
minIndex = j; //将最小数的索引保存
}
//把查到的最小的给到了第一个i=0索引,依次下去
temp = array[minIndex];
array[minIndex] = array[i];
array[i] = temp;
}
return array;
}
- 插入排序
上面两个,和面试官,随便说说就好,插入排序稍微麻烦点点吧,可能也是因为我是一个比较菜的应届生 = =,用白话来说:“插入排序就跟打扑克牌一样,for循环取牌 ,在通过while循环来比较进行插排, 刚开始还好,比较的不多,但是取牌取多了之后,他进行比较的次数也变多了”,就这白话一说,面试官就知道你明白了这个插入排序的意思,上代码
/**- 插入排序
- @param array
- @return
*/
public static void insertSort(int[] array) {
int index = 0;
int current = 0;
for (int i = 1; i < array.length; i++) {
index = i - 1; //左边是排好序的
current = array[i]; //当前取到的扑克牌
while (index >= 0 && array[index] > current) {
//如果左边的排的比取到的排的大
array[index + 1] = array[index];
index–;
}
array[index + 1] = current;
}
}
4.希尔排序
应届生面试 白话就这么说:“希尔排序也是插入排序的一种, 插入排序的升级版,它是一种缩小增量的排序方式,按照一定增量分组,进行插入排序,当增量为1的时候,就只有一组,排完,顺序就排好了”,上代码让你看清清,上代码前给大家分享一组B站关于排序理解的可视化贼好的一组视频<舞动的排序>https://space.bilibili.com/34739903/
/**
* 希尔排序
*
* @param array
* @return
*/
public static int[] ShellSort(int[] array) {
int len = array.length;
int temp;
int gap = len / 2; //分两组
while (gap > 0) {
for (int i = gap; i < len; i++) {
temp = array[i]; //依次拿到gap后面索引元素
int preIndex = i - gap; //依次拿到gap前面索引
while (preIndex >= 0 && array[preIndex] > temp) {//分两组,相当于间隔比较大小,交换位置
array[preIndex + gap] = array[preIndex];
preIndex -= gap;
}
array[preIndex + gap] = temp;
}
gap /= 2; //直到gap = 0,跳出循环
}
return array;
}
- 快速排序
你可以这么和面试官说:“分而治之的思想, 把一个序列分为较大和较小两个子序列,然后递归的去排序这两个子序列” 视频链接帮助你理解https://www.bilibili.com/video/BV1xW411Y7g3
步骤1:从数列中挑出一个元素,称为 “基准”(pivot );
步骤2:重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
步骤3:递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。