Java三种基础排序算法(冒泡、插入、选择)

一、冒泡排序

1、原理:
将给定的数组中的元素按从小到大的顺序排列,冒泡排序是从第一个元素开始相邻两个元素比较,将值大的那个元素往后挪,这样一遍下来,数组中最大的元素就放在了最后一个位置上;第二遍遍历同上,但只比较到倒数第二个位置,将找到的最大值放在倒数第二个位置上,以此类推。过程可看图示:在这里插入图片描述
2、代码如下:

public class Sort {
    public static void main(String[] args) {
        //冒泡测试
        int[] arr = new int[]{12, 5, 7, 89, 54, 32, 13};
        BubbleSort(arr);
        System.out.println(Arrays.toString(arr));
        }
        /*1、冒泡排序*/
    private static void BubbleSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {//循环次数
            boolean flag = false;
            for (int j = 0; j < arr.length - 1 - i; j++) {//第一遍循环
                if (arr[j+1] < arr[j]) {
                    flag = true;
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
            if(!flag){
                return;
            }
        }
    }
}

二、选择排序

1、原理:
将给定数组中的元素从小到大的顺序排序,选择排序是将数组遍历,第一遍找到最小值,将最小值与第一个元素交换位置;第二遍从第二个元素往后找,找到最小值与第二个元素交换位置,以此类推,过程如图:
在这里插入图片描述
2、代码如下:

public class Sort {
    public static void main(String[] args) {
        //插入排序测试
        int[] arr = new int[]{12, 5, 7, 89, 54, 32, 13};
        SelectSort(arr);
        System.out.println(Arrays.toString(arr));
    }

    /*2、选择排序*/
    private static void SelectSort(int[] arr){
        for(int i = 0;i < arr.length - 1;i++){//遍历趟数
            int min = arr[i];
            int now = i;
            for(int j = i+1;j < arr.length;j++){//某一趟找最小值
                if(arr[j] < min){
                    min = arr[j];
                    now = j;
                }
            }
            //找到最小值后交换
            if(now != i){
                int temp = arr[i];
                arr[i] = arr[now];
                arr[now] = temp;
            }
        }
    }
}

三、插入排序:

1、原理:
将给定数组中的元素按照从小到大的顺序排序,默认第一个元素是有序的,其他元素从后往前一一对比大小,比该位置元素小就继续往前比较,找到合适位置,然后将之前比较过的大于该元素的位置顺次往后移动,将该元素插入到小于该元素的后面。过程如图:
在这里插入图片描述
2、代码如下:

public class Sort {
    public static void main(String[] args) { 
        //插入排序测试
        int[] arr = new int[]{12, 5, 7, 89, 54, 32, 13};
        insertSort(arr);
        System.out.println(Arrays.toString(arr));
    }
    /*插入排序*/
    private static void insertSort(int[] arr){
        for(int i = 1;i < arr.length;i++){
            int val = arr[i];
            // 在i前面已经排序好的序列中,找i元素插入的合适的位置
            int j=i-1;
            for(; j>=0; --j){
                if(val < arr[j]) {
                    arr[j+1] = arr[j];
                }
                else {
                    break;
                }
            }
            // 把val元素插入到当前位置,然后循环结束
            arr[j+1] = val;
        }
    }
}

至于查找时可以用二分查找对直接插入排序进行优化,代码如下:

private static void InsertSort(int[] arr) {
    for(int i=1; i<arr.length; ++i) {
        int val = arr[i];
        // 优化成二分查找合适的插入位置,不再使用线性查找
        // 0  j  找第一个小于val的值
        int index = findInsertPos(arr, 0, i-1, val);
        for(int j=i; j>index; --j){
            arr[j] = arr[j-1];
        }
        arr[index] = val;
    }
}
private static int findInsertPos(
        int[] arr, int i, int j, int val) {
    while(i <= j)
    {
        int mid = (i+j)/2;
        if(val < arr[mid])
        {
            j = mid-1;
        } else {
            i = mid+1;
        }
    }
    return i;
}
发布了45 篇原创文章 · 获赞 11 · 访问量 4837

猜你喜欢

转载自blog.csdn.net/weixin_44187963/article/details/90903033