性能一览:

 

注释:

1. 稳定性:每趟排序完,会不会破坏元素的相对位置

2. 冒泡排序最好情况:O(n),算法需要改进

3. 希尔排序:

1). 希尔排序的复杂度和增量序列是相关的
2). {1,2,4,8,...}这种序列并不是很好的增量序列,使用这个增量序列的时间复杂度(最坏情形)是O(n^2)

 

代码实现:

public class Arithmetic {
    /**
     * 选择排序,升序排列
     *
     * @param nums
     * @return
     */
    public int[] selectSortArray(int[] nums) {
        for (int i = 0; i < nums.length - 1; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] > nums[j]) {
                    int temp = nums[i];
                    nums[i] = nums[j];
                    nums[j] = temp;
                }
            }
        }
        return nums;
    }

    /**
     * 冒泡排序,升序排列
     *
     * @param nums
     * @return
     */
    public int[] bubbleSortArray(int[] nums) {
        int len = nums.length;
        boolean didSwap;
        for (int i = 0; i < len - 1; i++) { //趟数
            didSwap = false;
            for (int j = 0; j < len - 1 - i; j++) { //次数
                if (nums[j] > nums[j + 1]) {
                    int temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;

                    didSwap = true;
                }
            }

            if(!didSwap) {
                return nums;
            }
        }
        return nums;
    }

    /**
     * 快速排序,升序排列
     *
     * @param nums
     * @return
     */
    public int[] quickSortArray(int[] nums) {
        partitionQuickSort(0, nums.length - 1, nums);
        return nums;
    }

    private void partitionQuickSort(int low, int high, int[] nums) {
        if (low >= high) return;
        int lowTemp = low;
        int highTemp = high;
        int tempNum = nums[lowTemp];

        while (lowTemp < highTemp) {
            while (nums[highTemp] >= tempNum &&
                    lowTemp < highTemp) {
                highTemp--;
            }

            if (lowTemp == highTemp) {
                break;
            }

            nums[lowTemp] = nums[highTemp];
            lowTemp++;
            
            while (nums[lowTemp] <= tempNum &&
                    lowTemp < highTemp) {
                lowTemp++;
            }

            if (lowTemp == highTemp) {
                break;
            }

            nums[highTemp] = nums[lowTemp];
            highTemp--;
        }

        //给中间的赋值
        nums[lowTemp] = tempNum;

        partitionQuickSort(low, lowTemp - 1, nums);
        partitionQuickSort(highTemp + 1, high, nums);
    }

    /**
     * 插入排序,升序排列
     *
     * @param nums
     * @return
     */
    public int[] insertSortArray(int[] nums) {
        for (int i = 1; i < nums.length; i++) {
            int index = i - 1;
            int insertVal = nums[i];

            while (index >= 0 && insertVal < nums[index]) {
                nums[index + 1] = nums[index];
                index--;
            }

            nums[index + 1] = insertVal;
        }

        return nums;
    }

    /**
     * 希尔排序, 升序排列
     *
     * @param nums
     * @return
     */
    public int[] shellSortArray(int[] nums) {
        int gap = nums.length;
        do {
            gap = (gap + 1) / 2;
            for (int i = gap; i < nums.length; i++) {
                int index = i - gap;
                int insertVal = nums[i];

                while (index >= 0 && insertVal < nums[index]) {
                    nums[index + gap] = nums[index];
                    index -= gap;
                }

                nums[index + gap] = insertVal;
            }
        } while (gap > 1);
        return nums;
    }

}

 

 

 

参考:
https://blog.csdn.net/yushiyi6453/article/details/76407640
https://blog.csdn.net/qq_39207948/article/details/80006224

 

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!