public class Main {
public static void main(String[] args) {
Main example=new Main();
//插入排序,用例为练习2.1-1,最坏情况运行时间:theta n平方.
example.INSERTION_SORT(new int[]{31, 41, 59, 26, 41, 58});
//练习2.1-3
example.CHECK_QUESTION(new int[]{31, 41, 59, 26, 41, 58},22);
//练习2.1-4
example.BINARY_SUM(new int[]{1, 1, 0, 0, 1, 1}, new int[]{1, 1, 1, 0, 0, 0});
//练习2.2-2选择排序
example.CHOSE_SORT(new int[]{31, 41, 59, 31, 41, 58});
//2.2-4:对输入进行控制,使之偏向能够使得算法具有最佳运行情况的排列
//2.3.1归并排序,例子为2.3-1
int[]A=new int[]{3,41,52,26,38,57,9,49};
example.MERGE_SORT(A,0,6);
for (int i : A) {System.out.print(i+" ");}System.out.println();
//2.3-5二分查找
example.CHECK_BINARY(A,9,0,A.length);
//思考题2-4
example.RESERVE_PAIR(new int[]{2,3,8,6,1});
example.MERGE_SORT(new int[]{2, 3, 8, 6, 1}, 0, 5);
}
public void INSERTION_SORT(int[] A){
//从第二个数开始遍历
for (int j=1;j<A.length;j++){
int key = A[j];
int i=j-1;
//找到key的正确位置
while (i>=0&&key>A[i]){//降序
// while (i>=0&&key<A[i]){//升序
A[i+1]=A[i];//向后移
i--;
}
A[i+1]=key;//插入
}
//打印结果
for (int i : A) {
System.out.print(i+" ");
}
System.out.println();
}
public void CHECK_QUESTION(int []A,int v){
int i=0;
while (i!=A.length){
if (A[i]==v){
System.out.println("Find it!");
return;
}
i++;
}
System.out.println("NIL");
}
public void BINARY_SUM(int[]A,int[]B){
int curr=0;
int []C=new int[A.length+1];
for (int i=A.length-1;i>=0;i--){
if (A[i]+B[i]+curr==3){
curr=1;
C[i+1]=1;
} else if (A[i]+B[i]+curr==2){
curr=1;
C[i+1]=0;
}else if (A[i]+B[i]+curr==1){
curr=0;
C[i+1]=1;
}else if (A[i]+B[i]+curr==0){
curr=0;
C[i+1]=0;
}
}
C[0]=curr;
for (int i :
C) {
System.out.print(i+" ");
}
System.out.println();
}
public void CHOSE_SORT(int []A){
for (int i=0;i<A.length-1;i++){
//记录最小元素的值和下标
int min=A[i];
int curr=i;
for (int j=i+1;j<A.length;j++){
if (A[j]<min){
min=A[j];
curr=j;
}
}
//交换值
A[curr]=A[i];
A[i]=min;
}
for (int i : A) {
System.out.print(i+" ");
}
System.out.println();
}
public void MERGE_SORT(int[] A,int p,int r) {
//这里划分和原书不一样,个人认为这样划分比较合理,左闭右开
if (r-p>1) {
//划分(注意:左闭右开指的是划分,而不是合并)
int q = p+(r-p) / 2;
//递归
MERGE_SORT(A, p, q);
MERGE_SORT(A, q, r);
//合并
// MERGE_GUARD(A, p, q, r);//有哨兵的合并
// MERGE_NO_GUARD(A,p,q,r);//无哨兵的合并
// return MERGE_GUARD2(A,p,q,r);//查看逆序对数量
}
}
public void MERGE_NO_GUARD(int[] A, int p, int q, int r) {
int i=0;int l=p;int mid=q;
int []T = new int[r - p];
//在T中重排
while (p<mid||q<r){
if (q>=r||(p<mid&&A[p]<=A[q]))T[i++]=A[p++];
else T[i++]=A[q++];
}
//返回原数组
for (i=0;i<r-l;i++)A[i+l]=T[i];
}
public void MERGE_GUARD1(int[] A,int p,int q,int r){
int n1=q-p;//左半边
int n2=r-q;//右半边
int[] L = new int[n1 + 1];
int[] R = new int[n2 + 1];
for (int i = 0; i < n1 ; i++) {
L[i] = A[p + i];
}
for (int j = 0; j < n2 ; j++) {
R[j] = A[q + j];
}
L[n1]=Integer.MAX_VALUE;//哨兵,少了剩余元素的判断
R[n2]=Integer.MAX_VALUE;
int i=0;
int j=0;
int inversions=0;//查看逆序对数量
for (int k=p;k<r;k++){
if (R[i]<L[j]){
A[k] = R[i];
inversions++;
i++;
}else {
A[k]=L[j];
j++;
}
}
}
public int MERGE_GUARD2(int[] A,int p,int q,int r){
int n1=q-p;//左半边
int n2=r-q;//右半边
int[] L = new int[n1 + 1];
int[] R = new int[n2 + 1];
for (int i = 0; i < n1 ; i++) {
L[i] = A[p + i];
}
for (int j = 0; j < n2 ; j++) {
R[j] = A[q + j];
}
L[n1]=Integer.MAX_VALUE;//哨兵,少了剩余元素的判断
R[n2]=Integer.MAX_VALUE;
int i=0;
int j=0;
int inversions=0;//查看逆序对数量
for (int k=p;k<r;k++){
if (R[i]<L[j]){
A[k] = R[i];
inversions++;
i++;
}else {
A[k]=L[j];
j++;
}
}
return inversions;
}
public void CHECK_BINARY(int []A,int v,int l,int r){
// if (r-l>1){//递归实现
// int mid=l+(r-l)/2;
// if (A[mid]>v)CHECK_BINARY(A,v,l,mid);
// else if (A[mid]<v)CHECK_BINARY(A,v,mid,r);
// else if (A[mid]==v) System.out.println("FIND IT!");
// }
int mid=0;
while (l<r){
mid=l+(r-l)/2;
if (A[mid]==v) {
System.out.println("FIND IT!");
return;
}
else if (A[mid]<v) l=mid;
else l=mid+1;//左闭右开
}
}
public void RESERVE_PAIR(int[] A){
for (int i=1;i<A.length;i++){
for (int j=i-1;j>=0;j--)
if (A[i]<A[j]) System.out.print("("+A[j]+","+A[i]+")"+" ");
}
}
}
算法导论第二章:算法基础-全部代码实现
最新推荐文章于 2021-04-08 17:17:41 发布