JAVA排序算法

package sort;


/**
 * 排序算法(升序)
 * @author Allen
 * stable sort: 稳定排序
 * unstable sort:
 * In-place sort: 不占用额外内存或占用常数的内存
 * Out-place sort:
 */
public class Sort {
    public static int[] arr = { 3, 5, 2, 9, 6, 1, 4, 8, 7, 0 };


    /**
    * 插入排序
    * 特点:stable sort、In-place sort
    * 方法核心1:从左到右依次保证有序,然后将下一个元素插入到左侧适当位置
    * 方法核心2:对第i个,依次,从右往左比较,若大于第i个的值,则将当前值向右移动,最后不能移动时,则将i插入到最终的位置
    * 最优复杂度:当输入数组就是排好序的时候,复杂度为O(n),而快速排序在这种情况下会产生O(n^2)的复杂度。
    * 最差复杂度:当输入数组为倒序时,复杂度为O(n^2)
    */
    static void insertSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            int j = i - 1;
            int temp = arr[i];
            while (j >= 0 && arr[j] > temp) {
                arr[j+1] = arr[j];
                j--;
            }
            arr[j+1] = temp;
        }
    }

    /**
    * 冒泡排序(优化版)
    * 特点:stable sort、In-place sort
    * 方法核心1:i每循环一次,从最右侧依次比较相邻两个,若相同,则交换,最终将最小的数放到最左侧,下次比较则不比较最左侧的数(通过i++来实现)
    * 方法核心2:首先假设数组是有序的,若产生了交换,则证明数组无序,若未产生交换,则数组为有序,可结束方法。
    * 最优复杂度:O(n)
    * 最差复杂度:O(n^2)
    */
    public static void bubbleSort(int[] arr){
        boolean isSorted;
        int temp;
        for (int i = 0; i < arr.length - 1; i++) {
            isSorted = true;
            for (int j = arr.length - 1; j > i; j--) {
                if(arr[j] < arr[j-1]){
                    temp = arr[j];
                    arr[j] = arr[j-1];
                    arr[j-1] = temp;
                    isSorted = false;
                }
            }
            if(isSorted == true){
                return;
            }
        }
    }

    /**
    * 选择排序
    * 特点:In-place sort,unstable sort
    * 方法核心:每次找一个未排序部分的最小值,并放到未排列部分的最左侧
    * 最优复杂度:O(n^2)
    * 最差复杂度:O(n^2)。
    */
    public static void selectSort(int[] arr){
        int minIndex;
        int min;
        for (int i = 0; i < arr.length - 1; i++) {
            minIndex = i;
            for (int j = i+1; j < arr.length; j++) {
                if(arr[minIndex] > arr[j]){
                    minIndex = j;
                }
            }
            min = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = min;
        }
    }

    /**
    * 测试方法
    */
    public static void main(String[] args) {
        selectSort(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]);
            if(i != arr.length -1){
                System.out.print(",");
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值