0
点赞
收藏
分享

微信扫一扫

基本的排序算法

小美人鱼失去的腿 2022-04-23 阅读 24
排序算法

选择排序

在每一次循环中找到最小的值,将该值的索引赋值给minPos,都找完之后将该值和i所对应的值做交换

public class demo1 {
    public static void main(String[] args) {
        int[] arr = {5,3,6,8,1,7,9,4,2};

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

        for (int i : arr) {
            System.out.print(i+" ");
        }
    }
}

冒泡排序

在这里插入图片描述

public class demo1 {
    public static void main(String[] args) {
        int[] arr = {5,3,6,8,1,7,9,4,2};

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

        for (int i : arr) {
            System.out.print(i+" ");
        }
    }
}

插入排序

从下标为一的元素开始,和它之前的元素进行比较,如果较小,则交换位置
在这里插入图片描述

public class demo1 {
    public static void main(String[] args) {
        int[] arr = {5,3,6,8,1,7,9,4,2};

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

        for (int i : arr) {
            System.out.print(i+" ");
        }
    }
}

希尔排序(改进的插入排序)

首先给定数组一个间隔,从0开始根据间隔取得相对应的元素,把这些元素使用插入排序排好顺序;之后再到下标为1的元素,也根据相同的间隔进行取值排序,依此类推。在所有的元素都排过顺序后,再取一个新的间隔,一般为第一个间隔的一半重复操作;最后一定要以间隔为一再排一次

比如首先以间隔为4进行排序
在这里插入图片描述
得到[1,6,2,3,5,12,8,4,9,13,11,7,10,15,14]

之后再以间隔为2进行排序
在这里插入图片描述
最后以间隔为一排序一次
在这里插入图片描述

代码实现

第一种

public class demo1 {
    public static void main(String[] args) {
        int[] arr = {5,3,6,8,1,7,9,4,2,10,16,12,15};

        for(int gap=arr.length/2;gap>0;gap/=2){//首先以数组长度的一半作为初始间隔
            for(int i=gap;i<arr.length;i++){
                for(int j=i;j>gap-1;j-=gap){
                    if(arr[j]<arr[j-gap]){
                        int temp = arr[j];
                        arr[j] = arr[j-gap];
                        arr[j-gap] = temp;
                    }
                }
            }
        }

        for (int i : arr) {
            System.out.print(i+" ");
        }
    }
}

第二种(效率更高一些)

public class demo1 {
    public static void main(String[] args) {
        int[] arr = {5,3,6,8,1,7,9,4,2,10,16,12,15};

        int h=1;
        while (h<arr.length/3){
            h=h*3+1;
        }

        for(int gap=h;gap>0;gap=(gap-1)/3){
            for(int i=gap;i<arr.length;i++){
                for(int j=i;j>gap-1;j-=gap){
                    if(arr[j]<arr[j-gap]){
                        int temp = arr[j];
                        arr[j] = arr[j-gap];
                        arr[j-gap] = temp;
                    }
                }
            }
        }

        for (int i : arr) {
            System.out.print(i+" ");
        }
    }
}

快速排序(分为单轴快排和双轴快排)

单轴快排

以数组中某个元素作为轴点,把所有比它小的元素移动到轴点的左边,把所有比它大的元素移动到轴点的右边;注意这时候左右两边的元素还是无序的,只是把数组分成了两部分;分好之后,再对左右两个分区按照同样的运算规则再次进行排序,一直分到只剩一个为止

在这里插入图片描述
代码实现

public class demo1 {
    public static void main(String[] args) {
        int[] arr = {5,3,6,8,1,7,15,4,2,10,16,12,9};

        sort(arr,0,arr.length-1);

        for (int i : arr) {
            System.out.print(i+" ");
        }
    }
    public static void sort(int[] arr,int leftBound,int rightBound){
        if(leftBound>=rightBound){
            return;
        }
        int pivot = arr[rightBound];//轴点
        int left = leftBound;//从0开始
        int right = rightBound-1;//从数组的倒数第二位开始

        while (left<=right){
            while (left<=right && arr[left]<=pivot) left++;//找到比轴点大的元素时停止
            while (left<=right && arr[right]>pivot) right--;//找到比轴点小的元素时停止

            //交换位置
            if(left<right){
                swap(arr,left,right);
            }
        }

        //把轴点放到中间
        swap(arr,left,rightBound);

        //这时候left表示中间值
        int mid = left;
        sort(arr,leftBound,mid-1);
        sort(arr,mid+1,rightBound);
    }

    public static void swap(int[] arr,int i,int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}
举报

相关推荐

0 条评论