面试手撕排序

手撕排序

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

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

冒泡排序

原理:

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

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++];
        }
    }
}
相关推荐
寻星探路5 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
曹牧7 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
爬山算法8 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty7258 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎8 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄8 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
忆~遂愿8 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds8 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹8 小时前
【Java基础】多态 | 打卡day2
java·开发语言