java自顶向下斐波那契_归并排序(自顶向下?自底向上?)

1 #include

2 #include

3

4 #define ARR_SIZE 20

5 #define MIN(x, y) (x)>(y)?(y):(x)

6 using namespace std;

7

8 int kk= 0;

9

10 void mergeBUsort(int a[]);

11 void merge(int a[], int lo, int mid, int hi);

12 void CreateRandArr(int a[]);

13 void exchange(int *a, int *b);

14

15 int main()

16 {

17 int a[ARR_SIZE];

18 int i;

19 CreateRandArr(a);

20 mergeBUsort(a);

21 cout << "after sort: " << endl;

22 for(i=0;i

23 {

24 cout << a[i] << ' ' ;

25 }

26

27 return 0;

28 }

29

30 void mergeBUsort(int a[])

31 {

32 int sz=1;

33 for(sz=1; sz < ARR_SIZE; sz =sz)

34 {

35 /* 下面的for循环为什么是 ARR_SIZE - sz 而不是 ARR_SIZE - 2sz:如果是后者的话则数组的最后一段就不能排序了,之所以lo>ARR_SIZE - 2sz还能继续归并,

36 意思是虽然我后面的元素不足2sz个了,但这后面不足2sz个的元素依然可以分为1点几个序列(一个有序序列有sz个元素),依然要归并为1个序列

37 而当后面的元素不足sz个时,也就是不到一个sz序列的长度,说明剩下的这不到sz个元素本身就是有序的,所以不用进行归并 */

38 for(int lo = 0;lo

39 {

40 merge(a, lo, lo sz-1, MIN(lo 2*sz-1, ARR_SIZE-1)); /* 因为下一次归并lo是从2sz开始,所以这里hi取lo 2*sz-1而不是lo 2*sz */

41 }

42 }

43 }

44

45 void merge(int a[], int lo, int mid, int hi)

46 {

47 int i, j=0, k=lo; /* 对于递归调用的函数,千万要注意:每次递归调用里的参数每次取的都是对应当次递归的值!例如这里的k值,每次应该赋值为lo而不是0!这个错误很容易犯 */

48 int ap[hi 1];

49 for(i=0;i<=hi;i )

50 {

51 ap[i] = a[i];

52 }

53 i = lo;

54 j = mid 1;

55 while(k<=hi)

56 {

57 if(i > mid)a[k] = ap[j ];

58 else if(j > hi)a[k] = ap[i ];

59 else if(ap[i] <= ap[j]) a[k] = ap[i ];

60 else if(ap[i] > ap[j]) a[k] = ap[j ];

61 k ;

62 }

63

64 cout << "No."<< kk << endl;

65 }

66

67 void CreateRandArr(int a[])

68 {

69 int i;

70 for(i=0;i

71 {

72 a[i] = rand() % 100;

73 cout <

74 }

75 cout << endl;

76 }

77

78 void exchange(int *a, int *b)

79 {

80 int temp;

81 temp = *a;

82 *a = *b;

83 *b = temp;

84 }

另一种?

1 #include

2 #include

3

4 #define ARR_SIZE 20

5

6 using namespace std;

7

8 int kk= 0;

9

10 void mergesort(int a[], int lo, int hi);

11 void merge(int a[], int lo, int mid, int hi);

12 void CreateRandArr(int a[]);

13 void exchange(int *a, int *b);

14

15 int main()

16 {

17 int a[ARR_SIZE];

18 int i;

19 CreateRandArr(a);

20 mergesort(a, 0, ARR_SIZE -1);

21 cout << "after sort: " << endl;

22 for(i=0;i

23 {

24 cout << a[i] << ' ' ;

25 }

26

27 return 0;

28 }

29

30 void mergesort(int a[], int lo, int hi)

31 {

32 if(lo >= hi) return; /* 如果这里没有等于的话,会陷入无限递归 */

33 int mid = lo (hi -lo)/2;

34 mergesort(a, lo, mid);

35 mergesort(a, mid 1, hi);

36 merge(a, lo, mid, hi);

37 }

38

39 void merge(int ar[], int lo, int mid, int hi)

40 {

41 int ap[ARR_SIZE];

42 /* 注意下面这三个变量的赋值,对于递归调用的函数,千万要注意:每次递归调用里的参数每次取的都是对应当次递归的值!

43 每次merge操作的只是ar数组中的一部分而不是整个数组,例如这里的m值,每次应该赋值为lo而不是0!这个错误很容易犯 */

44 int i=lo,j=mid 1,m=lo;

45 for(int k=0;k

46 {

47 ap[k] = ar[k];

48 }

49 while(m<=hi)

50 {

51 if(i>mid)ar[m ]=ap[j ];

52 else if(j>hi)ar[m ] = ap[i ];

53 else if(ap[i]< ap[j])ar[m ] = ap[i ];

54 else ar[m ] = ap[j ];

55 }

56

57

58 }

59

60 void CreateRandArr(int a[])

61 {

62 int i;

63 for(i=0;i

64 {

65 a[i] = rand() % 100;

66 cout <

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值