38. {
39. int middle=(low+high)/2;
40. merge_sort(a,low,middle);
41. merge_sort(a,middle+1,high);
42. mmerge(a,low,middle,high);
43. }
44.}
45.
46.int main()
47.{
48. int a[]={9,3,5,7,6,8,10,22,21,34};
49. display(a,10);
50. merge_sort(a,0,9);
51. display(a,10);
52.
53. return 0;
54.}
堆排序
[cpp] viewplain copy
1./*
2.堆排序
3.
(1)用大根堆排序的基本思想
4.① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
5.② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,
6.由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
7.③ 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。
8.然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,
9.由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n- 2].keys≤R[n-1..n].keys,
10.同样要将R[1..n-2]调整为堆。
11.……
12.直到无序区只有一个元素为止。
13.
(2)大根堆排序算法的基本操作:
14.① 初始化操作:
将R[1..n]构造为初始堆;
15.② 每一趟排序的基本操作:
将当前无序区的堆顶记录R[1]和该区间的最后一个记录交换,然后将新的无序区调整为堆(亦称重建堆)。
16.注意:
17.①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。
18.②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。
19.堆排序和直接选择排序相反:
在任何时刻,堆排序中无序区总是在有序区之前,
20.且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止。
21.*/
22.
23.#include
24.
25.using namespace std;
26.
27.//生成大根堆
28.void HeapAdjust(int SortData[],int StartIndex, int Length)
29.{
30. while(2*StartIndex+1 < Length)
31. {
32. int MaxChildrenIndex = 2*StartIndex+1 ;
33. if(2*StartIndex+2 < Length )
34. {
35. //比较左子树和右子树,记录最大值的Index
36. if(SortData[2*StartIndex+1]37. {
38. MaxChildrenIndex = 2*StartIndex+2;
39. }
40. }
41. if(SortData[StartIndex] < SortData[MaxChildrenIndex])
42. {
43. //交换i与MinChildrenIndex的数据
44. int tmpData =SortData[StartIndex];
45. SortData[StartIndex] =SortData[MaxChildrenIndex];
46. SortData[MaxChildrenIndex] =tmpData;
47. //堆被破坏,需要重新调整
48. StartIndex = MaxChildrenIndex ;
49. }
50. else
51. {
52. //比较左右孩子均大则堆未破坏,不再需要调整
53. break;
54. }
55. }
56.}
57.
58.//堆排序
59.void HeapSortData(int SortData[], int Length)
60.{
61. int i=0;
62.
63. //将Hr[0,Length-1]建成大根堆
64. for (i=Length/2-1; i>=0; i--)
65. {
66. HeapAdjust(SortData, i, Length);
67. }
68.
69. for (i=Length-1; i>0; i--)
70. {
71. //与最后一个记录交换
72. int tmpData =SortData[0];
73. SortData[0] =SortData[i];
74. SortData[i] =tmpData;
75. //将H.r[0..i]重新调整为大根堆
76. HeapAdjust(Sort