面试手撕排序

手撕排序

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

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

冒泡排序

原理:

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

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++];
        }
    }
}
相关推荐
CoderYanger5 小时前
贪心算法:2.将数组和减半的最少操作次数
java·算法·leetcode·贪心算法·1024程序员节
柯南二号5 小时前
【后端】【Java】RESTful书面应该如何写
java·开发语言·restful
JIngJaneIL5 小时前
基于Java+ vueOA工程项目管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
测试人社区-小明5 小时前
从前端体验到后端架构:Airbnb全栈SDET面试深度解析
前端·网络·人工智能·面试·职场和发展·架构·自动化
linsa_pursuer5 小时前
回文链表算法
java·算法·链表
CoderYanger5 小时前
贪心算法:8.买卖股票的最佳时机
java·算法·leetcode·贪心算法·1024程序员节
爱笑的眼睛115 小时前
SQLAlchemy 核心 API 深度解析:超越 ORM 的数据库工具包
java·人工智能·python·ai
爱学习的小可爱卢5 小时前
JavaEE进阶——SpringBoot拦截器详解:从入门到实战
java·spring boot·后端
凛_Lin~~5 小时前
安卓 面试八股文整理(基础组件篇)
java·安卓