【排序算法】Java实现几种常用的排序算法

闲来无事,写了一下几种常用的排序算法,自测ok,如有测试NG的用例,欢迎指出来以便改正。

/**
 * 排序接口
 */
public interface ArraySortInterface {
    /**
     * 数组排序
     *
     * @param array 待排序数组
     */
    void sort(int[] array);
}

1.选择排序

import java.util.Arrays;

/**
 * 选择排序原理
 * 寻找数组中最小的元素,将它和数组中第0个元素交换位置
 * 在数组剩余元素中寻找最小的元素(何为剩余?现在第0个元素是最小的,从下标1开始),将它与数组的第1个元素交换位置
 * ...
 * ...
 * ...
 * 继续在数组中寻找最小的元素,将它与数组的第n个元素交换位置,如此反复,直到全部完成
 * 选择排序核心:不断寻找剩余元素中最小的元素
 */
public class SelectSort implements ArraySortInterface {
    private static final String TAG = "SelectSort";

    @Override
    public void sort(int[] array) {
        if (array == null || array.length == 0) {
            return;
        }
        System.out.println(TAG);
        sort(array, 0);
    }

    private void sort(int[] array, int start) {
        int min = array[start]; // 最小值
        int index = start; // 最小值的索引
        for (int i = start + 1; i < array.length; i++) {
            if (min > array[i]) {
                min = array[i];
                index = i;
            }
        }
        int current = array[start];
        array[start] = min;
        array[index] = current;
        start++;
        if (start < array.length) {
            sort(array, start);
        } else {
            System.out.println("here is sort result:" + Arrays.toString(array));
        }
    }
}

2.插入排序

import java.util.Arrays;

/**
 * 插入排序原理,打扑克牌的时候,我们一张接一张地抓牌
 * 1.抓到第1张牌时,无需特殊处理,放在手上
 * 2.抓第2张牌,如果比第1张牌小,放在左边;如果比第1张牌大或者一样大,放在右边(目前只有2张牌,不是左边就是右边)
 * 3.抓第3张牌,如果比第1张牌小,放在左边;如果比第2张牌大或者一样大,放在右边;如果比第1张大并且比第2张小,放在中间
 * 4.抓第4张牌,如果比第一张牌小,放在左边;如果比第3张牌大或者一样大,放在右边;如果比第1张大并且比第3张小,放在中间,这个时候手上已经有三张牌了,中间有2个位置,需要计算放到哪个位置。
 * ...
 * ...
 * ...
 * 如此反复,直到所有的牌抓完,以下为代码实现.
 */
public class InsertSort implements ArraySortInterface {
    private static final String TAG = "InsertSort";

    @Override
    public void sort(int[] array) {
        if (array == null || array.length == 0) {
            return;
        }
        System.out.println(TAG);
        for (int i = 1; i < array.length; i++) {
            // 待插入的元素,第0个无需插入
            int toBeInsert = array[i];
            if (toBeInsert >= array[i - 1]) { // 插入位置:右边
                System.out.println("the element to be insert is bigger than it's last,no need to handle");
                continue;
            }
            if (toBeInsert < array[0]) { // 插入位置:左边,即index为0的情况
                System.out.println("the element to be insert is smaller than the first element,insert to the left");
                insert(array, i, toBeInsert, 0);
                continue;
            }
            // 插入位置:[1,i-2]闭区间,计算插入位置index
            System.out.println("insert to the middle");
            int index = getInsertIndex(array, i, toBeInsert);
            insert(array, i, toBeInsert, index);
        }
        System.out.println("here is sort result:" + Arrays.toString(array));
    }

    private int getInsertIndex(int[] array, int i, int toBeInsert) {
        int index = 1; // 走到这里插入的位置不会小于1
        for (int k = 0; k < i; k++) {
            if (toBeInsert >= array[k] && toBeInsert < array[k + 1]) {
                index = k + 1;
                break;
            }
        }
        return index;
    }

    private void insert(int[] array, int i, int toBeInsert, int index) {
        for (int k = i - index - 1; k >= 0; k--) {
            array[k + index + 1] = array[k + index];
        }
        array[index] = toBeInsert;
    }
}

3.冒泡排序

import java.util.Arrays;

/**
 * 冒泡排序
 */
public class BubbleSort implements ArraySortInterface {
    private static final String TAG = "BubbleSort";

    @Override
    public void sort(int[] array) {
        if (array == null || array.length == 0) {
            return;
        }
        System.out.println(TAG);
        for (int i = 1; i < array.length; i++) {
            for (int j = 0; j < array.length - i; j++) {
                if (array[j] > array[j + 1]) {
                    swap(array, j);
                }
            }
        }
        System.out.println("here is sort result:" + Arrays.toString(array));
    }

    private void swap(int[] array, int index) {
        int temp = array[index];
        array[index] = array[index + 1];
        array[index + 1] = temp;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值