算法导论-归并排序
2015-04-04 11:41
22 查看
/********************************************************************************************* 归并排序 分治思想 递归 详见算法导论中文版page17 *********************************************************************************************/ #include <iostream> using namespace std; void merge(int[], int, int, int); void merge_sort(int[], int, int); int main() { int testa[] = { 3,4,1,5,7,8,4,0,11,1 }; merge_sort(testa, 0, 9); system("pause"); // 看看是否testa数组已经改变。函数调用改变了其值 for (int i = 0; i < 10; i++) { cout << testa[i] << " "; } system("pause"); return 0; } void merge(int a[], int p, int q, int r) { int n1, n2; n1 = q - p + 1; //from p to q n2 = r - q; // from q+1 to r // c语言用malloc int *L = (int*)malloc((n1+1)*sizeof(int)); int *R = (int*)malloc((n2+1)*sizeof(int)); for (int i = 0; i < n1; i++) *(L+i) = a[p + i]; for (int j = 0; j < n2; j++) { *(R+j) = a[q + 1 + j]; } *(L + n1) = 1000; *(R + n2) = 1000; for (int k = p, i = 0, j = 0; k <= r; k++) { if (*(L+i) <= *(R+j)) { a[k] = *(L+i); i++; } else { a[k] = *(R+j); j++; } } free(L); free(R); //每次输出排序子类,便于观察 for (int i = p; i <= r; i++) { cout << a[i] << " "; } cout << endl; } void merge_sort(int a[], int p, int r) { if (p < r) { int q = (p + r) / 2; merge_sort(a, p, q); merge_sort(a, q + 1, r); merge(a, p, q, r); } }
相关文章推荐
- 算法导论之插入排序,选择排序,归并排序,冒泡排序,希尔排序,堆排序,快速排序的c语言实现
- 【算法导论】归并排序
- 算法导论 归并排序解决逆序数
- 一头扎进算法导论-归并排序
- [算法导论 第2章]归并排序
- 【算法导论】第二章之归并排序
- [算法导论]归并排序
- 再读算法导论,排序一(归并排序)。
- 从零开书学算法(导论)之归并排序
- 再读算法导论关于归并排序
- 算法导论2.3.2--归并排序
- 【算法导论】归并排序实现
- C++ 归并排序实现(算法导论)
- 【算法导论】2-2 二路归并排序(分治)merge-sort 和逆序对的问题
- 归并排序 (不采用哨兵) 算法导论2.3-2答案
- 【算法导论学习-002】归并排序(MergeSort)
- 在读算法导论关于归并排序
- 【算法导论】分治法及归并排序
- 算法导论1:插入排序和归并排序 2016.1.1
- 【算法导论】归并排序