栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

记载常见排序的代码【Java】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

记载常见排序的代码【Java】

public class Main {
    public static void main(String[] args) {
        int[] array = {3,2,4,1,5};
        int[] temp = new int[array.length];

        radixSort(array);
        System.out.println(Arrays.toString(array));
    }

    //基数排序
    public static void radixSort(int[] array){
        //初始化桶
        int[][] bucket = new int[10][array.length];
        int[] everyBucketEleNum = new int[10];

        //得到最大数的位数,这个位数决定总共排几次
        int max = 0;
        for (int i = 0;i < array.length;i++){
            if (array[i] > max){
                max = array[i];
            }
        }
        int maxLength = (max + "").length();
        int temp = 1;//取位数的值
        for (int i = 1;i <= maxLength;i++){
            //先放到桶中
            for (int j = 0;j < array.length;j++){
                //第一轮循环就是得到这个数的个位、下一轮循环就是百位。。。
                int digitOfElement = (array[j] / temp) % 10;
                //把它加入到桶中
                bucket[digitOfElement][everyBucketEleNum[digitOfElement]] = array[j];
                everyBucketEleNum[digitOfElement]++;
            }

            //然后从桶里面取出来
            int index = 0;
            for (int j = 0;j < 10;j++){
               if (everyBucketEleNum[j] > 0){
                   for (int k = 0;k < everyBucketEleNum[j];k++){
                       array[index] = bucket[j][k];
                       index++;
                   }
                   everyBucketEleNum[j] = 0;
               }
            }

            //进行下一次的时候 temp要变化
            temp *= 10;
        }
    }

    //归并排序
    public static void mergeSort(int[] array){
        int[] temp = new int[array.length];
        mergeSort(array,0,array.length - 1,temp);
    }
    public static void mergeSort(int[] array,int left,int right,int[] temp){
        if (left < right){
            int middle = (left + right) / 2;

            //先分左边
            mergeSort(array,left,middle,temp);
            //再分右边
            mergeSort(array,middle + 1,right,temp);

            //然后进行治
            sort(array,left,middle,right,temp);
        }
    }
    public static void sort(int[] array,int left,int middle,int right,int[] temp){
        //i是对左边的索引,j是对右边的索引,t是对temp的索引
        int i = left;
        int j = middle + 1;
        int t = 0;

        while (i <= middle && j <= right){
            if (array[i] < array[j]){
                temp[t] = array[i];
                i++;
                t++;
            }else {
                temp[t] = array[j];
                t++;
                j++;
            }
        }

        //如果左边有剩的
        while (i <= middle){
            temp[t] = array[i];
            i++;
            t++;
        }

        //如果右边有剩的
        while (j <= right){
            temp[t] = array[j];
            t++;
            j++;
        }

        //然后把temp赋值到array上面
        t = 0;//t是temp的索引
        for (int k = left;k <= right;k++){
            array[k] = temp[t];
            t++;
        }
    }

    //快速排序
    public static void quickSort(int[] array,int l,int r){
        if (l < r){
            int left = l;
            int right = r;
            int x = array[l];

            while (left < right){
                //先从右往左
                while (left < right && array[right] > x){
                    right--;
                }
                if (left < right){
                    array[left] = array[right];
                    left++;
                }

                //再从左往右
                while (left < right && array[left] < x){
                    left++;
                }
                if (left < right){
                    array[right] = array[left];
                    right--;
                }
            }

            array[left] = x;
            quickSort(array,l,left - 1);
            quickSort(array,left + 1,r);
        }
        System.out.println(Arrays.toString(array));
    }

    //希尔排序,交换式
    public static void shellSort1(int[] array){
        for (int gap = array.length / 2;gap > 0;gap = gap / 2){
            for (int i = gap;i < array.length;i++){
                for (int j = i - gap;j >= 0;j = j - gap){
                    if (array[j + gap] < array[j]){
                        int temp = array[j];
                        array[j] = array[j + gap];
                        array[j + gap] = temp;
                    }
                }
            }
        }

        System.out.println(Arrays.toString(array));
    }

    //希尔排序,移位式
    public static void shellSort2(int[] array){
        for (int gap = array.length/2;gap > 0;gap = gap/2){
            for (int i = gap;i < array.length;i++){
                int insertIndex = i - gap;
                int insertVal = array[i];

                while (insertIndex >= 0 && insertVal < array[insertIndex]){
                    array[insertIndex + gap] = array[insertIndex];
                    insertIndex = insertIndex - gap;
                }

                array[insertIndex + gap] = insertVal;
            }
        }

        System.out.println(Arrays.toString(array));
    }

    //插入排序
    public static void insertSort(int[] array){
        int insertVal;//要插入的值
        int insertIndex;//要插入的位置的下标

        for (int i = 1;i < array.length;i++){//i要从1开始
            insertIndex = i - 1;//这里的初始值是i - 1 ,而不是i 一定记住了!
            insertVal = array[i];

            //找到要插入的位置
            while (insertIndex >= 0 && array[insertIndex] > insertVal){
                //把每个数据往后挪
                array[insertIndex + 1] = array[insertIndex];
                insertIndex--;
            }

            //找到了要插入的位置
            array[insertIndex + 1] = insertVal;
        }

        System.out.println(Arrays.toString(array));
    }

    //选择排序
    public static void selectSort(int[] array){
        int min;//记录最小值
        int minIndex;//最小值的下标

        for (int i = 0;i < array.length - 1;i++){//外层for表示一共需要比较几轮,内层for表示每一轮的索引
            //默认第一个是最小值
            min = array[i];
            minIndex = i;

            for (int j = i + 1;j < array.length;j++){
                if (array[j] < min){
                    min = array[j];
                    minIndex = j;
                }
            }

            //每一轮比较完,就应该在i的位置更新最小值
            if (minIndex != i){//最小值不是i指向的位置
                array[minIndex] = array[i];
                array[i] = min;
            }
        }

        System.out.println(Arrays.toString(array));
    }

    //冒泡排序(升级版)
    public static void bubbleSort(int[] array){
        //定义flag,记录有没有发生交换
        boolean flag = false;//默认是没有发生交换

        for (int i = 0;i < array.length - 1;i++){
            for (int j = 0;j < array.length - i - 1;j++){
                if (array[j + 1] < array[j]){
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;

                    flag = true;//说明发生了交换
                }
            }

            if (flag){
                //发生了交换,则继续
                flag = false;
            }else {
                break;
            }
        }

        System.out.println(Arrays.toString(array));
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/305782.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号