《算法导论》中的算法实现

/**
 * 插入排序
 *
 * @param a
 * @param desc 升序
 */
public static void insert(Integer[] a, Integer desc) {
    int i = 1;
    int key = 0;
    for (i = 1; i < a.length; i++) {
        int k = i;
        while (k > 0 && a[k] > a[k - 1]) {
            int temp = a[k];
            a[k] = a[k - 1];
            a[k - 1] = temp;
            k--;
        }
        key = a[i];
    }
    for (int k = 0; k < a.length; k++) {
        System.out.print(a[k] + " ");
    }
}

/**
 * 选择排序法
 *
 * @param a
 */
public static void select(Integer[] a) {
    for (int i = 0; i < a.length - 1; i++) {
        int flag = i;
        for (int j = i + 1; j < a.length; j++) {
            if (a[j] < a[flag]) {
                flag = j;
            }
        }
        //a[i]与a[flag]交换位置
        if (i != flag) {
            int temp = a[i];
            a[i] = a[flag];
            a[flag] = temp;
        }
        System.out.print("选择排序第" + i + "步:");
        for (int k = 0; k < a.length; k++) {
            System.out.print(a[k] + " ");
        }
        System.out.println();
    }

}

/**
 * 分治法
 *
 * @param a 为合并的数组
 * @param p 从下标 p开始
 * @param q 下标中间 q
 * @param r 下标r结束
 */
public static void merge(Integer[] a, Integer p, Integer q, Integer r) {
    //创建两个数组,把对应的值放进去
    Integer n1 = q - p + 1;
    Integer[] L = new Integer[n1];
    // 解释:r-(q+1)-1=r-q
    Integer n2 = r - q;
    Integer[] R = new Integer[n2];

    for (int i = 0; i < n1; i++) {
        L[i] = a[p + i];
    }

    for (int j = 0; j < n2; j++) {
        R[j] = a[q+1+ j];
    }

    int i = 0, j = 0;
    int k = p;
    while(true){
        if (i == n1 || j == n2) {
           break;
        }else{
            if (L[i] <= R[j]) {
                a[k] = L[i];
                i++;
            } else {
                a[k] = R[j];
                j++;
            }
            k++;
        }
     }
    if(i==n1){
     //说明L已经排序完
        while(j

你可能感兴趣的:(《算法导论》中的算法实现)