各种常用排序算法的Java实现,不废话直接上代码

先来个汉诺塔

package Hannuota;

import java.util.Scanner;

/**
 * Author: PXY
 * Email: 1817865166@qq.com
 * Date: 2020/10/26
 */
public class Hanna {
    private static int i = 0;//记录移动步骤总数
    private static int n;//盘子总数
    private static long startTime;//程序开始执行时间
    private static long endTime;//程序结束执行时间

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        startTime = System.currentTimeMillis();
        HanNuo(n, 'A', 'B', 'C');
        endTime = System.currentTimeMillis();
        System.out.println(n + "个盘子从A柱移动到C柱最少共需要" + i + "步");
        System.out.println("当前程序的执行时间为" + (endTime - startTime) + "ms");
    }

    /**
     * @param n    盘子个数
     * @param from 开始的柱子
     * @param in   中间柱子
     * @param to   目标柱子
     */

    static void HanNuo(int n, char from, char in, char to) {
        if (n == 0) {
            throw new RuntimeException("The number of columns cannot be zero");
        }
        if (n == 1) {
            i++;
            System.out.println("第" + n + "个盘子从" + from + "移动到" + to);
        } else {
            //移动上面n-1个盘子到中间位置
            i++;
            HanNuo(n - 1, from, to, in);
            System.out.println("第" + n + "个盘子从" + from + "移动到" + to);
            //移动中间柱子n-1个盘子到目标位置
            HanNuo(n - 1, in, from, to);
        }
    }
}

选择排序

package Sort.SelectSort;

import java.util.Arrays;
import java.util.Scanner;

/**
 * Author: PXY
 * Email: 1817865166@qq.com
 * Date: 2020/10/26
 */
public class Select {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();//要排序的个数
        int[] arr = new int[n];//待排序的数组
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        System.out.println(Arrays.toString(arr) + "选择排序的结果是:" + Arrays.toString(select(arr)));
    }

    static int[] select(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[minIndex] > arr[j]) {
                    minIndex = j;
                }
            }
            if (i != minIndex) {
                int temp = arr[minIndex];
                arr[minIndex] = arr[i];
                arr[i] = temp;
            }
        }
        return arr;
    }
}

冒泡排序

package Sort.BubbleSort;

import java.util.Arrays;
import java.util.Scanner;

/**
 * Author: PXY
 * Email: 1817865166@qq.com
 * Date: 2020/10/26
 * 冒泡排序
 */
public class Bubble {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();//要排序的个数
        int[] arr = new int[n]; //要排序的数组
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        System.out.println(Arrays.toString(arr) + "从小到大冒泡排序结果为" + Arrays.toString(BubbleSort(arr)));
        System.out.println(Arrays.toString(arr) + "从大到小冒泡排序结果为" + Arrays.toString(DecBubbleSort(arr)));
    }

    static int[] BubbleSort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                int temp;//临时存放
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        return arr;
    }

    static int[] DecBubbleSort(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                int temp;//临时存放
                if (arr[j] < arr[j + 1]) {
                    temp = arr[j + 1];
                    arr[j + 1] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        return arr;
    }

}

快速排序

package Sort.BubbleSort;

import java.util.Arrays;
import java.util.Scanner;

/**
 * Author: PXY
 * Email: 1817865166@qq.com
 * Date: 2020/10/26
 */
public class QuickSort {
    public static void main(String[] args) {
        int n;//要排序的数的数目
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        int[] arr = new int[n];//要排序的数
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        System.out.println(Arrays.toString(arr) + "快速排序的结果是:" + Arrays.toString(quickSort(0, n - 1, arr)));
    }

    static int[] quickSort(int start, int end, int[] arr) {
        //如果start<end进行排序
        if (start < end) {
            //设置排序的标准数
            int stand = arr[start];
            //设置两个下标
            int low = start;
            int high = end;
            while (low < high) {
                //如果大于标准数
                while (low < high && arr[high] >= stand) {
                    high--;
                }

                arr[low] = arr[high];
                //如果小于标准数
                while (low < high && arr[low] <= stand) {
                    low++;
                }

                arr[high] = arr[low];
            }
            arr[low] = stand;
            //小的一边递归
            quickSort(start, low, arr);
            //大的一边递归
            quickSort(low + 1, end, arr);
        }
        return arr;
    }
}

直接插入排序

package Sort.InsertSort;

import java.util.Arrays;
import java.util.Scanner;

/**
 * Author: PXY
 * Email: 1817865166@qq.com
 * Date: 2020/10/26
 */
public class Insert {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();//要排序的个数
        int[] arr = new int[n];//待排序的数组
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        System.out.println(Arrays.toString(arr) +"插入排序的结果是:"+ Arrays.toString(insert(arr)));
    }

    static int[] insert(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            //若小于上一个数
            if (arr[i] < arr[i - 1]) {
                int temp = arr[i];
                //不断向前遍历直到找到小于或等于当前的数
                int j;
                for (j = i - 1; j >= 0 && temp < arr[j]; j--) {
                    //把前边的数赋值给后边的数
                    arr[j+1] = arr[j];
                }
                arr[j + 1] = temp;
            }
        }
        return arr;
    }
}

希尔排序

package Sort.InsertSort;

import java.util.Arrays;
import java.util.Scanner;

/**
 * Author: PXY
 * Email: 1817865166@qq.com
 * Date: 2020/10/26
 */
public class Shell {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();//要排序的个数
        int[] arr = new int[n];//待排序的数组
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        System.out.println(Arrays.toString(arr) + "希尔排序的结果是:" + Arrays.toString(shell(arr)));
    }

    static int[] shell(int[] arr) {
        //遍历所有的步长
        for (int d = arr.length / 2; d > 0; d /= 2) {
            // 遍历所有的元素
            for (int i = d; i < arr.length; i++) {
                //遍历本组中所有元素
                for (int j = i - d; j >= 0; j -= d) {
                    //如果当前元素大于加上步长后的元素
                    if (arr[j] > arr[j + d]) {
                        int temp = arr[j];
                        arr[j] = arr[j + d];
                        arr[j + d] = temp;
                    }
                }
            }
        }
        return arr;
    }
}

归并排序

package Sort.MergeSort;

import java.util.Arrays;
import java.util.Scanner;

/**
 * Author: PXY
 * Email: 1817865166@qq.com
 * Date: 2020/10/26
 */
public class Merge {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();//要排序的个数
        int[] arr = new int[n];//待排序的数组
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
        System.out.println(Arrays.toString(arr) + "归并排序的结果是:" + Arrays.toString(mergeSort(arr, 0, arr.length - 1)));
    }


    static int[] mergeSort(int[] arr, int low, int high) {
        int middle = (low + high) / 2;
        if (low < high) {
            mergeSort(arr, low, middle);
            mergeSort(arr, middle + 1, high);
            merge(arr, low, middle, high);
        }
        return arr;
    }

    static void merge(int[] arr, int low, int middle, int high) {
        //用于存储归并后的临时数组
        int[] temp = new int[high - low + 1];
        //记录第一个数组中需要记录的下标
        int i = low;
        //记录第二个数组中需要记录的下标
        int j = middle + 1;
        //记录临时数组下标
        int index = 0;
        while (i <= middle && j <= high) {
            //第一个数组中数据更小
            if (arr[i] <= arr[j]) {
                temp[index] = arr[i];
                i++;
            } else {
                temp[index] = arr[j];
                j++;
            }
            index++;
        }
        //处理多与数据
        while (i <= middle) {
            temp[index] = arr[i];
            i++;
            index++;
        }

        while (j <= high) {
           temp[index] = arr[j];
            j++;
            index++;
        }
        //将临时数组复制到新数组
        for (int k=0;k<temp.length;k++){
            arr[low+k]=temp[k];
        }
    }
}

基数排序

package Sort.RadixSort;

import java.util.*;

/**
 * Author: PXY
 * Email: 1817865166@qq.com
 * Date: 2020/10/26
 */
public class Radix {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();//要排序的个数
        int[] arr = new int[n];//待排序的数组
        for (int i = 0; i < n; i++) {
            arr[i] = scanner.nextInt();
        }
//        System.out.println(Arrays.toString(arr) + "基数排序的结果是:" + Arrays.toString(radixSort(arr)));
        System.out.println(Arrays.toString(arr) + "用队列实现的基数排序的结果是:" + Arrays.toString(RadixQueue(arr)));
    }

    static int[] radixSort(int[] arr) {
        int max = Integer.MIN_VALUE;
        //创建二维数组存放相应位上的数
        int[][] temp = new int[10][arr.length];
        //创建记录存放数字数量的数组
        int[] counts = new int[10];
        //循环找出最大的数
        for (int value : arr) {
            if (value > max) {
                max = value;
            }
        }
        int maxLength = String.valueOf(max).length();//最大数的长度
        //开始基数排序
        for (int i = 0, n = 1; i < maxLength; i++, n = n * 10) {
            //计算余数
            for (int value : arr) {
                int ys = value / n % 10;
                temp[ys][counts[ys]] = value;
                counts[ys]++;
            }
            //记录取出数字要存放的位置
            int index = 0;
            for (int k = 0; k < counts.length; k++) {
                //如果存放的有数
                if (counts[k] != 0) {
                    //循环取出元素
                    for (int l = 0; l < counts[k]; l++) {
                        arr[index] = temp[k][l];
                        index++;
                    }
                    counts[k] = 0;
                }
            }
        }
        return arr;
    }


    /**
     * @param arr
     * @return
     * @desc 用队列实现
     */
    static int[] RadixQueue(int[] arr) {
        int max = Integer.MIN_VALUE;
        //创建十个队列
        Queue[] temp = new LinkedList[10];
        //初始化队列
        for (int i = 0; i < 10; i++) {
            temp[i] = new LinkedList<Integer>();
        }
        for (int value : arr) {
            if (value > max) {
                max = value;
            }
        }
        int maxLength = String.valueOf(max).length();//最大数的长度
        //开始基数排序
        for (int i = 0, n = 1; i < maxLength; i++, n = n * 10) {
            //计算余数
            for (int value : arr) {
                int ys = value / n % 10;
                temp[ys].offer(value);
            }
            //记录取出数字要存放的位置
            int index = 0;
            for (Queue queue : temp) {
                //如果存放的有数
                while (!queue.isEmpty()) {
                    arr[index] = (int) queue.poll();
                    index++;
                }
            }
        }
        return arr;
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值