算法导论学习第一天笔记(java代码版)

来源:互联网 发布:java拼图游戏课程设计 编辑:程序博客网 时间:2024/04/20 20:04

1. 插入排序

  将数组A{5,2,4,6,1,3}以插入排序的方法进行排序

  伪代码:

 INSERTION-SORT(A)

  for j=2to A.length

    key=A[j]

    //InsertA[j] into the sorted sequence A[1..j-1]

    i=j-1

    while i>0 and A[i]>key

       A[i+1]=A[i]

       i=i-1

    A[i+1]=key

  Java代码:

  public class insertion {

public static void main(String[]args) {

int[] A=new int[]{5,2,4,6,1,3};

for(int j=1;j<A.length;j++){

int key=A[j];

int i=j-1;

while(i>=0 &&A[i]>key){

A[i+1]=A[i];

i=i-1;

}

A[i+1]=key;

}

for(int a:A){

System.out.println(a);

};

}

 }

伪代码中的数组是从1开始算起的

 

/**

 * 数组A={31,42,59,26,41,58},用插入排序法排列

 * @author Administrator

 *

 */

public class insertion_2 {

public static void main(String[]args) {

int[] A=new int[]{31,42,59,26,41,58};

for(int j=1;j<A.length;j++){

int key=A[j];

int i=j-1;

while(i>=0 &&A[i]>key){

A[i+1]=A[i];

i=i-1;

}

A[i+1]=key;

}

for(int a:A){

System.out.print(a+",");

}

}

}

 

 

/**

 * 数组A={31,42,59,26,41,58},按非升序排序

 * @author Administrator

 *

 */

public class insertion_3 {

public static void main(String[]args) {

int[] A=new int[]{31,42,59,26,41,58};

for(int j=1;j<A.length;j++){

int key=A[j];

int i=j-1;

while(i>=0 &&A[i]<key){

A[i+1]=A[i];

i--;

}

A[i+1]=key;

}

for(int a:A){

System.out.print(a+",");

}

/*

 * 伪代码

 * INSERTION_SORT

 *   for j=2 to A.length

 *     key=A[j]

 *     i=j-1

 *     while i>0 and A[i]<key

 *        A[i+1]=A[i]

 *        i--

 *     A[i+1]=key

 */

}

}

 

 

/*

 * 线性查找问题

 * 输入:n个数的一个序列A={a1,a2,a3,...,an}和一个值v

 * 输出:下标i使得v=A[i]或者当v不在A中出现时,v为特殊值NIL.

 * LINEAR-FIND

 *   i=1

 *   for j=1 to A.length

 *     if A[j]==v

 *        i=j

 *        break

 *   if i<A.length

 *      return v在A的第i个元素

 *   else

 *      return v是特殊值NIL

 */

 

package first_day;

 

import java.util.ArrayList;

import java.util.List;

 

/**

 * 两个二进制整数相加,两个整数分别存在两个n元数组A和B中。这两个整数的和按

 * 二进制形式存储在一个长度为n+1的元数组C中

 * @author Administrator

 *

 */

public class dyadic {

/*

 * 同符号相加啊

 */

public int[] add(int[]A,int[]B,int length,int f){

int[] C=new int[length+1];

int cl=C.length-1;

int n=0;

for(int j=(A.length-1);j>0;j--){

int i=(A[j]+B[j]+n);

n=0;

if(i>2){

C[cl]=1;

n=1;

}else if(i==2){

C[cl]=0;

n=1;

}else if(i==1){

C[cl]=1;

}else{

C[cl]=0;

}

cl--;

}

if(n==1){

C[cl]=n;

}

C[0]=f;

return C;

}

/*

 * 异号相减

 */

public int[] sub(int[]A,int[]B,int length,int f){

int[] C=new int[length+1];

int n=0;

int cl=C.length-1;

if(A[length-1]<B[length-1]){

n=1;

C[cl]=1;

cl--;

}else{

C[cl]=0;

cl--;

}

for(int j=(A.length-2);j>0;j--){

int i=A[j]-n;

if(i<B[j]){

C[cl]=i+2-B[j];

n=1;

}else{

C[cl]=0;

n=0;

}

cl--;

}

if(n==1){

f=B[0];

}

C[0]=f;

return C;

}

public static void main(String[]args) {

int[] A=new int[]{1,1,0,1,0,0,1,0,0,1,1,1,0,1,0};

int[] B=new int[]{0,1,0,1,0,0,1,0,0,1,1,1,0,1,1};

dyadic d=new dyadic();

int n=0;

int[] C;

n=A[0];

if(A[0]==B[0]){

C=d.add(A,B,A.length,n);

}else{

C=d.sub(A,B, A.length,n);

}

System.out.println(C.length);

for(int c:C){

System.out.print(c+" ");

}

}

 

}

/*

 * 在我的代码中,二进制数是按从右加到左,由于两个二进制整数一样长

 * 所有数值的第一位是符号位,不参与计算,但用于判断调用哪个方法,

 * 所以参与计算的数值是两个数组中的2~length这length-1个数,

 * 当两个数的类型相同时,跳转到add函数,进行从最后一位开始的相加

 * 操作,当相加数大于2时保留1并进1,当相加数等于2时保留0进1,当相

 * 加数为1或0时保留相加所得数不进位,最高位即C【0】为符号位取A【0】;

 * 若A[0]!=B[0],跳转到sub函数

 * 伪代码

 * DYADIC(A,B)

 *   n=A[1]

 *   length=A.length

 *   if A[1]=B[1]

 *     jump add(A,B,length,n)

 *   else

 *     jump sub(A,B,length,n)

 *ADD(A,B,length,f)

 *   C=C[length+1]

 *   n=0

 *   for j=A.length to 2

 *     i=A[j]+B[j]+n

 *     n=0

 *     if i>2

 *       C[j+1]=1

 *       n=1

 *     else if i=2

 *        C[j+1]=0

 *        n=1

 *     else if i=1

 *        C[j+1]=1

 *     else

 *        C[j+1]=0

 *    if n=1

 *      C[1]=1

 *    C[1]=f

 *SUB(A,B,length,f)

 *   C=C[length+1]

 *   n=0

 *   if A[length]<B[length]

 *      n=1

 *      C[C.length]=1

 *   else

 *      C[C.length]=0

 *   for j=length-1 to 2

 *      i=A[j]-n

 *      if i<B[j]

 *        C[j+1]=i+2-B[j]

 *        n=1

 *      else

 *        C[j+1]=0

 *        n=0

 *   if n=1

 *      f=B[1]

 *   C[1]=f

 */