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

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++;
            }
        }
    }

}

  

时间: 2024-11-07 11:02:47

【算法导论第二章】算法基础的相关文章

算法导论 第二章

2014-12-02 20:21:40 http://www.cnblogs.com/sungoshawk/p/3617652.html 上面链接指向算法导论第二章的预习博客,很值得一看,很详细. 插入算法: 1 #include <iostream> 2 3 using namespace std; 4 void insert_sort(int *datas, int length); 5 int main() 6 { 7 int a[10]={1,2,4,35,6,1,4,7,9,7};

算法导论第二章C++实现归并算法排序

归并算法排序的思想算法导论中讲的还算比较清楚. #include<iostream> using namespace std; void guibing(int *_array,int p,int q,int r); void merge_sort(int *_array,int p,int r); int main() { int a[8]={2,4,5,7,1,2,3,6}; int j1=0; int j2=7; merge_sort(a,j1,j2); int i=0; for(;i&

算法导论 第二章作业

//作业2. 1-2 template<class T> void insert(T* A, int  n) { for (int j = 1; j < n; ++j) { T key = A[j]; int i = j - 1; while (i >= 0 && key > A[i]) { A[i + 1] = A[i]; --i; } A[i + 1] = key; } } //2. 1-3 template<class T> void fin

算法导论第二章

插入排序源码: 1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 void insert_sort(int a[]) 7 { 8 for(int j=1;j<10;j++) 9 { 10 int key=a[j]; 11 int i=j-1; 12 while(i>=0 && a[i]>key) 13 { 14 a[i+1]=a[i]; 15 i--; 16

算法导论--第二章、插入排序

1. 插入排序类似于整理扑克牌(排列好顺序的扑克和待排序的扑克): 2. 插入排序(INSERTION-SORT)参数是一个数组A[1..n]共n个数,输入的各个数字原地排序(sorted in place),分为排好序的和待排序的,每次取一个待排序元素,找到插入的位置,插入已排好序的部分中.元素取完程序结束,复杂度为O(n^2): 3. 伪代码如下: INSERTION-SORT(A) for j <- 2 to length(A) do key <- A[j] //Insert A[j]

算法导论-第一章-算法在计算中的作用(速记)

算法就是把输入转换成输出的计算步骤的一个序列. 问题实例由计算该问题解所必需的(满足问题陈述中强加的各种约束的)输入组成. 若对每个输入实例,算法都以正确的输出停机,则称该算法是正确的. 许多有趣的算法问题所共有的两个特征: 1.存在许多候选解,但绝大多数候选解都没有解决手头的问题.寻找一个真正的解或一个做好的解可能是一个很大的挑战. 2.存在实际应用. 数据结构是一种存储和组织数据的方式,旨在便于访问和修改. 原文地址:https://www.cnblogs.com/lixiaov/p/104

第二章 算法基础 思考题2-1

package chap02; import static org.junit.Assert.*; import java.util.Arrays; import java.util.Random; import org.junit.Test; /*** * 在归并排序中对小数组采用插入排序 * * @author xiaojintao * */ public class ques2_1 { /** * 归并排序算法 * * @param a * @return */ static void m

算法导论(Introduction to Algorithms )— 第二章 算法入门 — 2.1 插入排序

一.插入排序:INSERTION-SORT 1.适用范围: which is an efficient algorithm for sorting a small number of elements. 对于少量元素的排序,插入排序是一种高效的算法. 2.原理: Insertion sort works the way many people sort a hand of playing cards. We start with an empty left hand and the cards

第二章 算法基础 思考题2-4(逆序对)

1 package chap02; 2 3 import static org.junit.Assert.*; 4 5 import java.util.Arrays; 6 7 import org.junit.Test; 8 9 public class ques2_4 { 10 /** 11 * 逆序对,将一个序列中的所有逆序对打印输出 12 * 13 * @author xiaojintao 14 * 15 */ 16 static void printReverseOrder(int[]