在计算机领域,一路走来,从最初的学习算法,到本科毕业,再到硕士即将毕业。对于归并排序也是听了有5年了,归并排序的思想很容易掌握,听了之后,也知道怎么做,以前记得也实现过,但是并没有认真的思考里面具体的问题。我的研究领域是深度学习,这里面的算法可能与传统计算机算法有些不同,但是其实基本思想还是很有关联的,底层的算法实现好坏,直接决定最终高层算法的性能。如果底层算法耗费资源,并且时间花费很大,由于高层算法会频繁调用底层的算法,那么底层算法的低性能,直接导致高层算法的低性能。
今天重新实现了归并排序,才发现,这里面还有很多学问,就比如如何原地排序,不申请任何额外的空间。
// 归并排序
class Solution18 {
public:
void mergeSortedArray(int A[], int m, int B[], int n) {
if (m == 0) { memcpy(A, B, n * sizeof(int)); return; }
if (n == 0) return;
int *C = new int[m]; // 开辟一个零时的存储
memcpy(C, A, m * sizeof(int));
int i = 0, j = 0, k = 0;
while (i < m && j < n) {
if (C[i] <= B[j])
A[k++] = C[i++];
else
A[k++] = B[j++];
}
if (i < m)
memcpy(A + k, C + i, sizeof(int)*(m - i));
else
memcpy(A + k, B + j, sizeof(int)*(n - j));
for (int i = 0; i < m + n; i++)
cout << A[i] << " ";
cout << endl;
delete[] C;
}
void mergeSort(int A[], int first, int last) {
if (first == last) return;
if (first + 1 == last) {
if (A[first] > A[last])
swap(A[first], A[last]);
return;
}
if (first < last) {
int mid = first + (last - first) / 2;
mergeSort(A, first, mid);
mergeSort(A, mid + 1, last);
mergeSortedArray(A, mid - first + 1, A + mid + 1, last - mid);
}
}
};