插入排序,Java实现

插入排序:

算法思想:另建一个新的数组,长度跟要要排序的数组大小相同,遍历原数组,遍历的时插入元素到新数组中,保证新数组每插入一个新元素时,都是有序的。即每次插入的时候先找到要插入的位置,然后把该位置及以后的元素后移,然后插入元素。直至遍历完原来的数组,这时候,新数组就是原数组的有序排列。

其他排序,可见我的其他博文)


/**
 * 插入排序
 */
public class InsertSort {
    
    /**
     * 常规的插入排序
     * 时间复杂度为O(n方)
     * @param arr
     * @return
     */
    public static int[] insertSort(int[] arr){
        int len = arr.length;
        int[] insertArr = new int[len];
        for(int i = 0; i < len; i++){
            int current = arr[i];
            int k;
            for (k = i - 1; k>=0 && insertArr[k] > current; k--){
                insertArr[k+1] = insertArr[k];
            }
            insertArr[k+1] = current;
        }
        return insertArr;
    }

    /**
     * 用二分排序优化插入排序,快速定位要插入的位置,减少比较次数
     * 在数组元素数据很大的时候效率提升比较明显,数据量少的时候速度提升不明显
     * @param arr
     * @return
     */
    public static int[] binaryInsertSort(int[] arr){
        int len = arr.length;
        int[] insertArr = new int[len];
        for(int i = 0; i < len; i++){
            int current = arr[i];
            int k = binarySearch(insertArr, current, 0, i-1);
            for (int j = i; j > k; j--){
                insertArr[j] = insertArr[j-1];
            }
            insertArr[k] = current;
        }
        return insertArr;
    }

    /**
     * 二分搜索改版,查找要插入的位置
     * @param arr
     * @param element
     * @param begin
     * @param end
     * @return
     */
    public static int binarySearch(int[] arr, int element, int begin, int end){
        if (begin == 0 && end <= 0){
            return 0;
        }
        int mid = (begin + end) /2;
        while(begin < end){

            if (arr[mid] == element){
                return mid+1;
            }else if (arr[mid] > element){
                if (begin == end -1){
                    return begin;
                }
                end = mid;
                mid = (begin+end)/2;
            }else{
                if (begin == end -1 && arr[end] < element){
                    return end+1;
                }else if (begin == end -1 && arr[end] > element){
                    return end;
                }

                begin = mid;
                mid = (end + begin)/2;
            }
        }
        return mid+1;
    }
    
    public static void main(String[] args) {
        int[] arr = {34,13,56,2,41,61,2,13,42,1,12};
        int[] arr1 = binaryInsertSort(arr);
        System.out.println(arr1);
    }
}

猜你喜欢

转载自blog.csdn.net/aa792978017/article/details/89054380