近两周初学算法,打算把算法导论上部分伪代码用C++或python实现一遍
1.归并排序算法的在C++上的实现:
算法的基本思路如下:
通过递归调用把数组分成更小的数组,对小的数组进行排序从而达成排序的效果。
void Merge(int point[], int low, int mid, int high)
{
int k = 0;
int i = low;
int j = mid + 1;
int* temp = new(nothrow) int[high - low + 1];
if (!temp) { //内存分配失败
cout << "error";
return;
}
while (i <= mid && j <= high)
{
if (point[i] < point[j])
temp[k++] = point[i++];
else
temp[k++] = point[j++];
}
while (i <= mid)
{
temp[k++] = point[i++];
}
while (j <= high)
{
temp[k++] = point[j++];
}
for (int k = 0, i = low; i<=high; ++k, ++i)
{
point[i] = temp[k];
}
delete[]temp;
}
void MergeSort(int arr[], int low, int high)
{
if (low < high)
{
int mid = (low + high) / 2;
MergeSort(arr, low, mid);
MergeSort(arr, mid + 1, high);
Merge(arr, low, mid, high);
}
}
int main() {
int a[10] = { 5,1,9,3,7,4,8,6,2,0 };
MergeSort(a, 0, 9);
for (int i = 0; i < 10; i++)
cout << a[i] << " ";
return 0;
}
2.关于n*n矩阵乘法的实现
a.最简单的实现方法:
def Mutiply1(A,B):
n=len(A)
m=0
C=[[m]*n for x in range(n)]##用来保存相乘的结果
for i in range(n):
for j in range(n):
C[i][j]=0
for k in range(n):
C[i][j]=C[i][j]+A[i][k]*B[k][j]
return C
a=[[1,1,1],[1,1,1],[1,1,1]]
b=[[1,1,1],[1,1,1],[1,1,1]]
Mutiply1(a,b)
运行结果如下:
[[3, 3, 3], [3, 3, 3], [3, 3, 3]]
b. 利用简单的分治法实现:
此方法通过将矩阵分块成4个小矩阵,利用递归的方法实现矩阵的乘法。
基本思路如下图:
本算法的效率并没有比上一个暴力算法高。该算法真正难点是如何把矩阵分块成子矩阵并最后合并,暂时我还没有思路如何去做这一点。以下是我尝试过但报错的代码:
def Mp11(matrix):##矩阵分块
row=len(matrix)##行数
end=int(row/2)##原矩阵行列数一半取整
new=[[0]*end for i in range(end)]
for m in range(end):##
new[m]=matrix[m][:end]
return new
def Mp12(matrix):
row=len(matrix)
end=int(row/2)
new=[[0]*end for i in range(end)]
for m in range(end):
new[m]=matrix[m][end:]
return new
def Mp21(matrix):
row=len(matrix)
if row%2!=0:
end=int(row/2)+1
new=[[0]*end for i in range(end)]
for m in range(end):
new[m]=matrix[end+m-1][:end-1]
return new
else:
row=len(matrix)
end=int(row/2)
new=[[0]*end for i in range(end)]
for m in range(end):
new[m]=matrix[end+m][:end]
return new
def Mp22(matrix):
row=len(matrix)
if row%2!=0:
end=int(row/2)+1
new=[[0]*end for i in range(end)]
for m in range(end):
new[m]=matrix[end+m-1][end-1:]
return new
else:
row=len(matrix)
end=int(row/2)
new=[[0]*end for i in range(end)]
for m in range(end):
new[m]=matrix[end+m][end:]
return new
def add(a,b):
n=len(a)
c=[[0 for col in range(n)] for row in range(n)]
for i in range(n):
for j in range(n):
c[i][j]=a[i][j]+b[i][j]
return c
def combination(a11,a12,a21,a22):
a=len(a11)
b=len(a21)
n=int((a+b)/2)
c=[[0 for col in range(a+b)] for row in range(a+b)]
for i in range(a+b):
for j in range(a+b):
if i<=n and j<=n:
c[i][j]=a11[i][j]
elif i<=n and j>n:
c[i][j]=a12[i][j-n]
elif i>n and j<=n:
c[i][j]=a21[i-n][j]
elif i>n-1 and j>n-1:
c[i][j]=a22[i-n][j-n]
return c
下面是主函数:
def Mutiply2(A,B):
n=len(A)
C=[[0]*n for x in range(n)]
if n==1:
C[0][0]=A[0][0]*B[0][0]
else:
C11=add(Mutiply2(Mp11(A),Mp11(B)),Mutiply2(Mp12(A),Mp21(B)))
C12=add(Mutiply2(Mp11(A),Mp12(B)),Mutiply2(Mp12(A),Mp22(B)))
C21=add(Mutiply2(Mp21(A),Mp11(B)),Mutiply2(Mp22(A),Mp21(B)))
C22=add(Mutiply2(Mp21(A),Mp12(B)),Mutiply2(Mp22(A),Mp22(B)))
C=combination(C11,C12,C21,C22)
return C
a=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]
b=a
Mutiply2(a,b)
会报错
IndexError Traceback (most recent call last)
<ipython-input-48-0faec53a1dd5> in <module>()
4 a=[[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]]
5 b=a
----> 6 Mutiply2(a,b)
<ipython-input-47-a6959dd72c2c> in Mutiply2(A, B)
5 C[0][0]=A[0][0]*B[0][0]
6 else:
----> 7 C11=add(Mutiply2(Mp11(A),Mp11(B)),Mutiply2(Mp12(A),Mp21(B)))
8 C12=add(Mutiply2(Mp11(A),Mp12(B)),Mutiply2(Mp12(A),Mp22(B)))
9 C21=add(Mutiply2(Mp21(A),Mp11(B)),Mutiply2(Mp22(A),Mp21(B)))
<ipython-input-47-a6959dd72c2c> in Mutiply2(A, B)
9 C21=add(Mutiply2(Mp21(A),Mp11(B)),Mutiply2(Mp22(A),Mp21(B)))
10 C22=add(Mutiply2(Mp21(A),Mp12(B)),Mutiply2(Mp22(A),Mp22(B)))
---> 11 C=combination(C11,C12,C21,C22)
12 return C
<ipython-input-46-b513a2aa6d37> in combination(a11, a12, a21, a22)
58 for j in range(a+b):
59 if i<=n and j<=n:
---> 60 c[i][j]=a11[i][j]
61
62 return c
IndexError: list index out of range
以上代码十分冗长,以后有思路再来看看如何实现这个算法。