面试手撕排序

手撕排序

(写的时候别忘了关提示,很多时候负面,给我错的代码还分心自己)

(小心别敲错一些变量,算法对了但是结果有问题,顺着逻辑梳理,看变量敲没敲错)

冒泡排序

原理:

扫描比较相邻不按顺序就交换(也可以理解为把第几大的依次放到后面)

java 复制代码
package sort;

import java.util.Scanner;

public class maopao {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(),a[]=new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n-i; j++) {
                if(j!=n-i-1&&a[j]>a[j+1]){
                    int temp=a[j];
                    a[j]=a[j+1];
                    a[j+1]=temp;
                }
            }
        }
        for (int i = 0; i < n; i++) {
            System.out.print(a[i]+" ");
        }
    }
}

选择排序

原理:

依次选最几小/大放到前面

java 复制代码
package sort;

import java.util.Scanner;

public class xuanze {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(),a[]=new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        for (int i = 0; i < n; i++) {
            int min = Integer.MAX_VALUE,wz=-1;
            for (int j = i; j <= n-1; j++) {
                 if(a[j]<min){
                     min = a[j];
                     wz = j;
                 }
            }
            int sum=a[i];
            a[i]=min;
            a[wz]=sum;
        }
        for (int i = 0; i < n; i++) {
            System.out.print(a[i]+" ");
        }
    }
}

快速排序

原理:

分治+分区,核心是分区,每次选基准值,要保证基准最左边的都比他小,右边的都比他大,可以理解为每次排好基准值对应的那个元素,分治就全排完。

java 复制代码
package sort;

import java.util.Scanner;

public class quick {
  static int n,a[]=new int[100005];

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        for (int i = 0; i < n; i++) {
            a[i]=sc.nextInt();
        }
        sort(0,n-1);
        for (int i = 0; i < n; i++) {
            System.out.print(a[i]+" ");
        }
    }
    static void sort(int l,int r){
        if(l>=r)return;
        int zj = kp(l,r);
        sort(l,zj-1);
        sort(zj+1,r);
    }static int kp(int l,int r){
        int sum=a[l];
        while(l<r){
            while(l<r&&a[r]>sum){
                r--;
            }
            if(l<r){
                a[l]=a[r];l++;
            }
            while(l<r&&a[l]<sum){
                l++;
            }
            if(l<r){
                a[r]=a[l];r--;}
        }
        a[l]=sum;
        return l;
    }
}

归并排序

原理:

分治+合并两个有序数组,合并细节可能有点麻烦,hot100应该都做过来链表版本的合并吧,这里就是换成了数组,主要也是注意一些边界细节啥的

java 复制代码
package guibing;

import java.util.Scanner;

public class guibing {
    static int n, a[] = new int[100005];

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }
        guib(0, n - 1);
        for (int i = 0; i < n; i++) {
            System.out.print(a[i] + " ");
        }
    }

    static void guib(int l, int r) {
        if (l >= r) return;
        int mid = l + (r - l) / 2;
        guib(l, mid);
        guib(mid + 1, r);
        int cd1 = mid - l + 1,cd2=r-mid, az[] = new int[cd1], ar[] = new int[cd2], f1 = 0, f2 = 0, qd = l, f3 = 0, f4 = 0;
        for (int i = l; i <= mid; i++) {
            az[f1++] = a[i];
        }
        for (int i = mid + 1; i <= r; i++) {
            ar[f2++] = a[i];
        }
        while (f3 < cd1 && f4 < cd2) {
            if (az[f3] <= ar[f4]) {
                a[qd++] = az[f3++];
            } else {
                a[qd++] = ar[f4++];
            }
        }


        while (f3 < cd1) {
            a[qd++] = az[f3++];
        }
        while (f4 < cd2) {
            a[qd++] = ar[f4++];
        }
    }
}
相关推荐
ray_liang6 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
Ray Liang7 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Sailing7 小时前
🚀 别再乱写 16px 了!CSS 单位体系已经进入“计算时代”,真正的响应式布局
前端·css·面试
Java水解7 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
SuperEugene10 小时前
Vue状态管理扫盲篇:Vuex 到 Pinia | 为什么大家都在迁移?核心用法对比
前端·vue.js·面试
Hilaku10 小时前
我会如何考核一个在简历里大谈 AI 提效的高级前端?
前端·javascript·面试
前端Hardy10 小时前
别再用 $emit 满天飞了!Vue 3 组件通信的 4 种正确姿势,第 3 种 90% 的人不知道
前端·vue.js·面试
我叫黑大帅11 小时前
前端如何利用 GitHub Actions 自动构建并发布到 GitHub Pages?
前端·面试·github
我叫黑大帅11 小时前
前端总说的防抖与节流到底是什么?
前端·javascript·面试
掘金安东尼11 小时前
从平面到空间:用 React Three Fiber 构建 3D 产品网格
前端·javascript·面试