归并排序与堆排序

 1 #include <iostream>
 2 using namespace std;
 3 
 4 //  归并排序
 5 void Merge(int a[],int b[],int i,int m,int n)
 6 {
 7     int j,k;
 8     for(j = m+1,k=i;i<=m&&j<=n;k++)
 9     {
10         if(a[i] < a[j]) 
11             b[k] = a[i++];
12         else 
13             b[k] = a[j++];
14     }
15 16 if(i<=m) 17 for(int p=i;p<=m;p++,k++) b[k] = a[p]; 18 if(j<=n) 19 for(int p=j;p<=n;p++,k++) b[k] = a[p]; 20 } 21 22 void copyArray(int a[],int b[],int s,int e) 23 { 24 for(int i = s;i<=e;i++) 25 b[i] = a[i]; 26 } 27 void Merge_Sort(int a[],int b[],int s,int t) 28 { 29 if(s == t) b[s] = a[s]; 30 else{ 31 int m = (s + t)/2; 32 Merge_Sort(a,b,s,m); 33 Merge_Sort(a,b,m+1,t); 34 Merge(b,a,s,m,t); 35 copyArray(a,b,s,t); // 减少一个中间数组的空间开销 36 } 37 } 38 39 void main() 40 { 41 int a[10] = {5,4,3,2,-1,9,10,15,8,6}; 42 int b[10]; 43 Merge_Sort(a,b,0,9); 44 for(int i=0;i<10;i++) 45 cout << a[i] << endl; 46 }
 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 // 大顶堆排序
 5 
 6 void HeapAdjust(int a[],int p,int size)
 7 {
 8     int lchild = 2*p;
 9     int rchild = 2*p+1;
10     int max = p;
11     if(p<=size/2)
12     {
13         if(a[max] < a[lchild] && lchild <=size) 
14             max = lchild;
15         if(a[max] < a[rchild] && rchild <=size) 
16             max = rchild;
17         if(max != p)
18         {
19             swap(a[max],a[p]);
20             HeapAdjust(a,max,size);
21         }
22     }
23 }
24 
25 void HeapSort(int a[],int s,int size)
26 {
27     // 建堆
28     for(int i=size/2;i>=s;i--)
29         HeapAdjust(a,i,size);
30 
31     // 调整
32     for(int i=size;i>=s;i--)
33     {
34         swap(a[s],a[i]);
35         HeapAdjust(a,s,i-1);
36     }
37 }
38 
39 void main()
40 {
41     int a[]= {5,1,4,3,2,-1,9,10,-15,19,20};
42 
43     HeapSort(a,1,10);
44     for(int i=1;i<=10;i++)
45         cout << a[i] << endl;
46 }

与书上的代码有点差别,个人理解的差别吧...

原文地址:https://www.cnblogs.com/xuxu8511/p/2440211.html