八大排序算法(Java,便于理解)

时间换空间排序算法

一.冒泡排序

java 复制代码
package SortDemo;

import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;

public class BubbleSort {
    //冒泡排序,相邻两个数两两比较
    private int[]a;

    public void swap(int i,int j){
        int temp=a[i];
         a[i]=a[j];
         a[j]=temp;
    }
    public void sort(int []arr){
        this.a=arr;
        int count=0;//统计程序运行次数
        //排序
        for (int i = 0; i <a.length-1; i++) {
            for (int j = 0; j <a.length-1-i; j++) {
                //从小到大排序
                if(a[j]>a[j+1]){
                    swap(j,j+1);
                }
                count++;
            }
        }
    }
    public void print(){
        System.out.println(Arrays.toString(a));
    }
    public static void main(String[] args) {
        int []a={1,9,3,6,8,4};

       BubbleSort  bubbleSort = new BubbleSort();
       bubbleSort.sort(a);
       bubbleSort.print();
    }
}

二.选择排序

java 复制代码
package SortDemo;

import java.util.Arrays;

public class SelectSort {
    private int[]a;

    public void swap(int i,int j){
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }

    public void sort(int []arr){
        this.a=arr;

        //选择排序
        for (int i = 0; i <a.length; i++) {
            int min=arr[i];
            for (int j = i+1; j <a.length; j++) {
                if(arr[j]<min){
                    min=arr[j];
                    swap(i,j);
                }
            }
        }
    }
    public void print(){
        System.out.println(Arrays.toString(a));
    }
    public static void main(String[] args) {
        int []a={1,9,3,6,8,4};
       SelectSort selectSort = new SelectSort();
       selectSort.sort(a);
       selectSort.print();
    }
}

三.插入排序

java 复制代码
package SortDemo;

import java.util.Arrays;

public class InsertSort {
    private int[]a;

    public void swap(int i,int j){
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
    public void sort(int []arr){
        this.a=arr;

        //排序
        for (int i = 1; i <a.length; i++) {
           int j=i;
           int tmp=a[i];//要插入的数据
           for (;j>0&&tmp<a[j-1];j--){
               a[j]=a[j-1];
           }
           a[j]=tmp;
        }
    }
    public void print(){
        System.out.println(Arrays.toString(a));
    }
    public static void main(String[] args) {
        int []a={1,9,3,6,8,4};
        InsertSort insertSort=new InsertSort();
         insertSort.sort(a);
         insertSort.print();
    }
}

四.希尔排序

java 复制代码
package SortDemo;

import java.util.Arrays;

public class XRSort {
    //希尔排序
    //先找到
    private int[]a;
    public void swap(int i,int j){
        int temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
    public void print(){
        System.out.println(Arrays.toString(a));
    }
    public void sort(int []arr) {
        this.a = arr;
        int gap=a.length/2;
        //排序
        while (gap>0){
            for (int i = gap; i < a.length; i++) {
                int j = i;
                int tmp = a[i];//默认第一个已经排好序
                for (; j >=gap && tmp < a[j - gap]; j-=gap) {
                    a[j] = a[j - gap];
                }
                a[j] = tmp;
            }
            gap/=2;
        }

    }

    public static void main(String[] args) {
        int []a={1,9,3,6,8,4};
         XRSort xrSort=new XRSort();
         xrSort.sort(a);
         xrSort.print();
    }
}

空间换时间排序算法

一.计数排序

java 复制代码
package SortDemo;

import java.util.Arrays;

public class CountStringSort {
    private int[] arr;

    public CountStringSort(int[] arr) {
        this.arr = arr;
    }

    //计数排序,先找到该数组最大的值作为一个新数组的索引
    public void sort(){

     int maxval=Arrays.stream(arr).max().getAsInt();

      //创建一个新数组统计每个索引对应的数字出现的个数
     int []s=new int[maxval+1];
     Arrays.fill(s,-1);//默认新建的数组的值为-1;

        for (int index : arr) {
            s[index]++;
        }

        //遍历新数组
        int count=0;
        for (int i = 0; i <s.length; i++) {
            while (s[i]>-1){
                arr[count++]=i;
                s[i]--;
            }
        }
    }

    public void print(){
        System.out.println(Arrays.toString(arr));
    }
    public static void main(String[] args) {
        int []a={1,9,3,6,8,4,3};
      CountStringSort countStringSort = new CountStringSort(a);
      countStringSort.sort();
      countStringSort.print();

    }
}

二.桶排序

java 复制代码
package SortDemo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class BucketSort {
    private int[]sum;
    //桶排序
    public void sort(int []arr){
        this.sum=arr;

        int n=10;//用来计算取要排序数组里的数在那个桶里面

        int size=0;//用来最后反向填充要排序数组索引

        //取要排序数组里最大数作为桶的个数
        int maxval= Arrays.stream(arr).max().getAsInt();

        //桶的个数
        List<Integer>bucket[]=new List[maxval];

        //初始化桶
        for (int i = 0; i <maxval; i++) {
            bucket[i]=new ArrayList<>();
        }

       //将数组数据归类桶
        for (int t : arr) {
           int  index=t/n;//第几个桶
           bucket[index].add(t);
        }

        //对桶里面的数据进行排序
        for (List<Integer> list : bucket) {
            list.sort((o1, o2) -> o1-o2);
        }

        //将每个桶中排好序的的数据依次反向填充到要排序的原数组中
        for (int i = 0; i <bucket.length; i++) {
            for (int j = 0; j <bucket[i].size(); j++) {
                arr[size++]=bucket[i].get(j);
            }
        }
        System.out.println(Arrays.toString(arr));
    }

    public static void main(String[] args) {
     new BucketSort().sort(new int[]{3,7,3,8,19,22,123,8,0});
    }
}

三.基数排序

java 复制代码
package SortDemo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

public class RadixSort {
    private int[] a;

    //基数排序
    public void sort(int[] a) {
        this.a = a;
        final int SIZE = 10;//桶的个数

        int maxVal = Arrays.stream(a).max().getAsInt();//拿到数组最大数
        int len = (int) (Math.log10(maxVal) + 1);//拿到最大数的位数
        int divisor = 1;//

         //循环最大数位数次,分别对数组每位数字依次进行排序
        for (int i = 0; i < len; i++) {
            List<Integer>[] bukets = new List[SIZE];//桶
            //初始化桶
            for (int k = 0; k < SIZE; k++) {
                bukets[k] = new ArrayList<>();
            }


            for (int val : a) {
                int index = val / divisor % SIZE;
                bukets[index].add(val);
            }
            //对桶内数据排序
            for (List<Integer> list : bukets) {
                list.sort(Comparator.comparingInt(o -> o));
            }
            //放入数组中
            int pos = 0;
            for (List<Integer> list : bukets) {
                if (!list.isEmpty()) {
                    for (int tmp : list) {
                        a[pos++] = tmp;
                    }
                }
            }
            divisor *= 10;
        }
    }


    public void print() {
        System.out.println(Arrays.toString(a));
    }


    public static void main(String[] args) {
        RadixSort sort = new RadixSort();
        sort.sort(new int[]{128,3,7,8,19,22,123});
        sort.print();
    }
}
相关推荐
小登ai学习10 分钟前
框架部分面试题学习
java·学习·面试
MilesMatheson23 分钟前
ubuntu 编译android源码报错:loadlocale.c:129: _nl_intern_locale_data:
c语言·开发语言·算法
new66699932 分钟前
Java实现命令模式
java·命令模式
程序员奇奥33 分钟前
统计有序矩阵中的负数
线性代数·算法·矩阵
Stealmoon_91 小时前
快速、简单的2D-6D位姿估计:Gen6D算法复现 (pytorch 1.12.1 + cu113)
人工智能·pytorch·算法
写代码的熊萌新1 小时前
JAVA2-类与对象编程(1)
java·开发语言
Kai HVZ1 小时前
《机器学习》——支持向量机(SVM)
算法·机器学习·支持向量机
知初~1 小时前
SpringBoot3
java·spring boot·spring·log4j·maven
kkkkatoq1 小时前
EasyExcel的应用
java·前端·servlet
pzx_0011 小时前
【深度学习】通俗理解偏差(Bias)与方差(Variance)
人工智能·python·深度学习·算法·机器学习·集成学习