泛型快排

简介:
/**
 * 快排(除null)
 *
 * @param array
 * @param <C>
 */
public static <C extends Comparable> void sort(C[] array) {
    if (null == array) {
        return;
    }
    sort(array, 0, array.length - 1);
}

/**
 * 快排
 *
 * @param array
 * @param start
 * @param end
 * @param <C>
 */
private static <C extends Comparable> void sort(C[] array, int start, int end) {
    if (end - start < 1) {
        return;
    }
    select(array, start, end);
    C split = array[start];
    int i = start;
    int j = end;
    while (i < j) {
        // 找到比split小的数
        while (i < j && bigger(array[j], split)) {
            j--;
        }
        if (i < j) {
            array[i++] = array[j];
        }
        // 找到比split大的数
        while (i < j && smaller(array[i], split)) {
            i++;
        }
        if (i < j) {
            array[j--] = array[i];
        }
    }
    array[i] = split;
    // 排序左边
    sort(array, start, i - 1);
    // 排序右边
    sort(array, i + 1, end);
}

/**
 * 选择策略
 *
 * @param array
 * @param start
 * @param end
 * @param <C>
 */
private static <C extends Comparable> void select(C[] array, int start, int end) {
    int mid = start + (end - start) / 2;
    if (smaller(array[start], array[mid])) {
        swap(array, start, mid);
    } else if (smaller(array[start], array[end])) {
        swap(array, start, end);
    }
}

/**
 * 交换值
 *
 * @param array
 * @param a
 * @param b
 * @param <C>
 */
private static <C extends Comparable> void swap(C[] array, int a, int b) {
    C t = array[a];
    array[a] = array[b];
    array[b] = t;
}

@SuppressWarnings("unchecked")
public static <C extends Comparable> boolean bigger(C a, C b) {
    return a.compareTo(b) > 0;
}

@SuppressWarnings("unchecked")
public static <C extends Comparable> boolean smaller(C a, C b) {
    return a.compareTo(b) < 0;
}
目录
相关文章
|
算法
【算法专题突破】双指针 - 复写零(2)
【算法专题突破】双指针 - 复写零(2)
38 0
java实现数组二分查找
java实现数组二分查找
|
搜索推荐 C++ 容器
(C/C++)STL函数和排序算法:快排以及归并排序
(C/C++)STL函数和排序算法:快排以及归并排序
(C/C++)STL函数和排序算法:快排以及归并排序
泛型栈和队列
泛型栈和队列
123 0
|
算法 Java
Java实现二分查找法
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
2157 0
排序方法、其他常用的方法
快速排序 function fast (arr) { if (arr.length <= 1) { return arr } let left = [] let right = [] let p = arr.
607 0