码迷,mamicode.com
首页 > 编程语言 > 详细

【算法导论第二章】算法基础

时间:2016-07-10 13:59:18      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:

2.1插入排序

扑克牌这个栗子不错。以后得多用扑克牌来形象化思考排序问题。

技术分享

根据伪代码用java实现插入排序

package com.panjn.java;

/**
 * Created by panjianning on 2016/7/10.
 */
public class InsertionSort {
  
    public static void main(String[] args) {
        int[] array = new int[]{1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
        InsertSort(array);
        for (int i = 0; i < 10; i++) {
            System.out.print(array[i] + " ");
        }
    }

    public static void InsertSort(int[] array) {
        for (int j = 1; j < array.length; j++) {
            int key = array[j];
            //将array[j](key)插入到array[0,...,j-1]
            int i = j - 1;
            //寻找合适位置
            while (i >= 0 && array[i] > key) {
                //将a[i]上移
                array[i+1] = array[i];
                i--;
            }
            array[i+1] = key;
        }
    }
}

  循环不变式。。。。。。。

2.2分析算法

RAM模型,输入规模,运行时间(假定第i行的每次执行需要时间Ci), 最坏情况与平均情况分析,增长量级

 

2.3设计算法

分治法

归并排序 MergeSort

对着伪码用java实现

package com.panjn.java;

/**
 * Created by panjianning on 2016/7/10.
 */
public class MergeSort {

    public static void main(String[] args) {
        int[] array = new int[]{1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
        mergeSort(array, 0, 9);
        for (int i = 0; i < 10; i++) {
            System.out.print(array[i] + " ");
        }
    }

    /**
     * 将数组array从start开始到end(包含end)的元素排序
     *
     * @param array
     * @param start
     * @param end
     */
    public static void mergeSort(int[] array, int start, int end) {
        if (start < end) {
            int mid = (start + end) / 2;
            mergeSort(array, start, mid);
            mergeSort(array, mid + 1, end);
            merge(array, start, mid, end);
        }
    }

    /**
     * 假定array[start,...,mid] 与 array[mid+1,...,end] 都已经排好序(升序)
     * 将array[start,...,mid]与array[mid+1,...,end]归并,使得array[start,...,end]为升序
     *
     * @param array
     * @param start
     * @param mid
     * @param end
     */
    public static void merge(int[] array, int start, int mid, int end) {
        int n1 = mid - start + 1;
        int n2 = end - mid;
        int[] L = new int[n1 + 1];
        int[] R = new int[n2 + 1];

        //将array[start,...,mid]复制到L[0,...,n1-1]
        System.arraycopy(array, start, L, 0, n1);
        //将array[mid+1,...,end]复制到R[0,...,n2-1]
        System.arraycopy(array, mid + 1, R, 0, n2);

        L[n1] = Integer.MAX_VALUE;
        R[n2] = Integer.MAX_VALUE;

        //将L[] 与 R[] 归并到 array[]

        //扫描L[]的下标,当从L[]中移一个元素到array[]时, i加1
        int i = 0;
        //扫描R[]的下标,当从R[]中移一个元素到array[]时, j加1
        int j = 0;
        for (int k = start; k <= end; k++) {
            if (L[i] <= R[j]) {
                array[k] = L[i];
                i++;
            } else {
                array[k] = R[j];
                j++;
            }
        }
    }

}

  

 

【算法导论第二章】算法基础

标签:

原文地址:http://www.cnblogs.com/mmyz-sysu-panjn/p/intro-Algorithm-Chapter2.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!