面试算法题—编程题2023
- 一、冒泡排序
- 二、选择排序
- 三、快速排序
- 四、其它排序
最近在看一些面试题,发现很多面试过程中都会要求手写排序编程题,经过一番查找整理,可以快速学习和使用相关排序算法题,通俗易懂,手撕代码吊打面试官。
一、冒泡排序
冒泡排序 是一种简单的排序算法,它重复地遍历待排序的数组,每次比较相邻的两个元素,如果顺序不对就交换它们。通过多次遍历,最终将待排序的数组按照从小到大或从大到小的顺序排列好。
冒泡排序的原理和过程
冒泡排序的原理很简单,每次比较相邻两个元素,如果前面的元素大于后面的元素,就交换它们。通过多次比较,最大(或最小)的元素会“浮”到数组的末尾,因此称为冒泡排序。
用动态可视化图更好的去理解冒泡排序
java代码实现
public class demo1 {
public static void main(String[] args) {
int[] a ={5,4,3,2,1};
sort(a);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]);
}
}
//冒泡排序
//1.比较数组中两个相邻的元素,如果第一个数比第二个数大,就交换
//2.每一次比较都会产出一个最大或者最小的元素
//3.下一轮少一次排序
//4.依次循环,直到结束!
public static void sort(int[] array){
//外层循环,判断程序要走多少次
int temp;//临时变量
for (int i = 0; i < array.length - 1; i++) {
//内层循环,比较两个数,如果第一个数比第二个数大,则交换
for (int j = 0; j < array.length-1-i; j++) {
if(array[j] > array[j+1]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
}
}
二、选择排序
1、 什么是选择排序?
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。选择排序是不稳定的排序方法。
2、选择排序原理是什么?
如下图,该图是选择排序的效果动图
java代码实现
class demo2 {
public static void main(String[] args) {
int[] arr = {26, 1, 80, 27, 133};
int temp = 0;
// for循环嵌套实现
for (int j=0;j<arr.length-1;j++){
for (int i=1+j;i<arr.length;i++){
if(arr[i]<arr[j]){
temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}
}
//实现遍历
System.out.print("[");
for (int x = 0; x < arr.length; x++) {
if (x == arr.length - 1) {
System.out.println(arr[x] + "]");
} else {
System.out.print(arr[x] + ",");
}
}
}
}
//结果
//[1,26,27,80,133]
三、快速排序
快速排序,顾名思义,是一种速度快,效率高的排序算法。
java代码实现
class demo3 {
public static void main(String[] args){
int[] arr = {4,1,2,3,5,14,23,12,7,14};
quickSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void quickSort(int[] arr, int left, int right) {
if(left >= right) {//终止条件,如果左边界下标等于有边界下标,或者大于右边界下标的时候,说明当前数组的长度已经是1乃至该数组物理上不存在了,因此就直接返回,终止递归,这里是递归出口。
return ;
}
int i = left,j = right,base = arr[i];//根据传入的左右边界声明出两个游标,同时指定好基准数,我们命名为base
while(i!=j) {//只要左右游标不相等,说明二者没有相遇,循环就会继续执行
while(i<j && arr[j] >= base) {//j游标先行,只要j游标指向的数值大于基准数,j游标就开始游移,需要注意的是在j游标游移的过程中也会时刻注意到i和j游标是否相遇了,只要相遇就停止
j--;//j游标是往前走
}
while(i<j && arr[i] <= base) {//i游标后走,只要是i游标指向的数值小于基准数,i游标就开始游移,需要注意的是i游标在游移的过程中也会时刻注意到i和j游标是否相遇了,只要相遇就停止
i++;
}
int temp = arr[j];//在退出上边的外循环之后,说明二者均指向了需要被交换的元素,也就是说i指向了一个大于基准数的元素,j指向了一个小于基准数的元素,因此二者发生交换。如果此时两数不是因为这种指向情况而导致的交换,是由于相遇导致的交换,那么这个交换将没有意义
arr[j] = arr[i];
arr[i] = temp;
}
arr[left] = arr[i];//与基准数交换,此时我们已经找到了基准数的准确位置,我们将基准数与当前位置上的元素进行一次交换
arr[i] = base;
quickSort(arr, left, i-1);//递归的处理当前两个游标位置的右边无序数组
quickSort(arr, i+1,right);//递归的处理当前两个游标位置的左边无序数组
}
}
四、其它排序
其它排序详情点击传送门
如果对你有帮助,可以点个小心心❤ 你的鼓励是我创作的动力!