面试手撕排序

手撕排序

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

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

冒泡排序

原理:

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

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++];
        }
    }
}
相关推荐
cyforkk1 小时前
12、Java 基础硬核复习:集合框架(数据容器)的核心逻辑与面试考点
java·开发语言·面试
身如柳絮随风扬6 小时前
Java中的CAS机制详解
java·开发语言
风筝在晴天搁浅8 小时前
hot100 78.子集
java·算法
故事和你918 小时前
sdut-Java面向对象-06 继承和多态、抽象类和接口(函数题:10-18题)
java·开发语言·算法·面向对象·基础语法·继承和多态·抽象类和接口
Configure-Handler9 小时前
buildroot System configuration
java·服务器·数据库
测试涛叔9 小时前
金三银四软件测试面试题(800道)
软件测试·面试·职场和发展
:Concerto9 小时前
JavaSE 注解
java·开发语言·sprint
电商API_1800790524710 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
一点程序10 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
C雨后彩虹10 小时前
计算疫情扩散时间
java·数据结构·算法·华为·面试