1. 插入排序
将数组A{5,2,4,6,1,3}以插入排序的方法进行排序
伪代码:
INSERTION-SORT(A)
for j=2 to 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
*/