面试手撕排序

手撕排序

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

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

冒泡排序

原理:

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

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 分钟前
Codeforces Round 1099 (Div. 2) 构造|贪心|图论|还原数组
java·算法·图论
yaoxin5211239 分钟前
414. Java 文件操作基础 - 批量压缩与索引:将154首十四行诗高效存储为带目录的二进制文件
java·windows·python
mCell9 分钟前
JavaScript:从事件循环到手写 Promise
javascript·面试·浏览器
huaCodeA10 分钟前
Android面试-Flow相关
android·面试·职场和发展
超梦dasgg11 分钟前
详细讲解:WebMvcConfigurer 接口
java·开发语言·spring
JAVA社区22 分钟前
Java进阶全套教程(三)—— Spring框架核心精讲
java·开发语言·spring·面试·职场和发展·mybatis
彭于晏Yan34 分钟前
OkHttp 与 RestTemplate 技术选型对比
java·spring boot·后端·okhttp
金銀銅鐵44 分钟前
[Java] 如何理解 class 文件中字段的 descriptor?
java·后端
500841 小时前
Graph Engine 是什么,为什么需要它
java·人工智能·性能优化·ocr·wpf
未若君雅裁1 小时前
服务雪崩、降级、熔断与服务保护
java·微服务