三傻排序:选择排序;冒泡排序;插入排序

51 阅读2分钟
  • 选择排序

第一个元素和其他位置相比,如果小于第一个元素则更新最小索引,比较完成之后交换位置。即可在数组头部获得最小值,依次执行下去,即可完成排序

  • 冒泡排序

从第一个位置开始跟下一个元素比较,若小于其值,则交换位置,直到最后一个元素,这样就在数组末尾得到了最大值,依次比较之后即可排序

  • 插入排序

原理类似于玩扑克牌时整理手牌的情景,我们手上的牌是有序的,将下一张牌插入到合适位置即可

代码实现:

​
public class a001_threeSillySorts {
    public static void main(String[] args) {
        int[] arr = {64, 25, 12, 22, 11};
        System.out.println("原始数组:");
        printArray(arr);
​
        insertionSort(arr);
​
        System.out.println("排序后的数组:");
        printArray(arr);
    }
​
​
    //选择排序
    /*
     * 双指针
     * 最小值索引和移动的索引
     * */
    public static void selectionSort(int[] arr) {
        //边界
        if (arr == null || arr.length < 2) {
            return;
        }
        //最后一位数是不需要再比较的,所以i=arr.length-2是边界
        for (int i = 0; i < arr.length - 1; i++) {
            //假设最小值索引是i
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[minIndex]) {
                    //如果有更小的值,则更新索引
                    minIndex = j;
                }
            }
            //循环完毕,即比较完之后再交换位置
            swap(arr, i, minIndex);
        }
    }
​
​
    //冒泡排序
    public static void bubbleSort(int[] arr) {
        //边界
        if (arr == null || arr.length < 2) {
            return;
        }
        //与选择排序相反,冒泡排序先排好的是最大位置的数,再去排未排序的数组
        for (int end = arr.length - 1; end > 0; end--) {
            for (int i = 0; i < end; i++) {
                if (arr[i] > arr[i + 1]) {
                    swap(arr, i, i + 1);
                }
            }
        }
    }
​
​
    //插入排序
    public static void insertionSort(int[] arr) {
        //边界
        if (arr == null || arr.length < 2) {
            return;
        }
        //假设第一个元素有序,从第二个开始插入,
        for (int i = 1; i < arr.length; i++) {
            //从右向左开始比较,如果小了则交换位置,一直到j指针<0或者arr[j] <= arr[j + 1]时结束循环
            for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
                swap(arr, j, j + 1);
            }
        }
    }
​
    //元素交换位置
    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
​
    //打印数组
    public static void printArray(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}
​