算法导论2.3-1~7问题总结答案

  •                  intindexA = 0;
                     intindexB=0;
                     int[] C = new int[indexA.length+B.length];
                     intindexC=0;
                     while(indexA<A.length&&indexB<B.length){
                          if(A[indexA]<B[indexB]){
                                C[indexC++]= A[indexA++];
                          }else{
                               C[indexC++] =B[indexB++];
                          }
                     while(indexA<A.length){
                          C[indexC++]=A[indexA++];
                    }
                    while(indexB<B.length){
                          C[indexC++] = B[indexB++];
                    }
                 }
    
#include<iostream>
#include<algorithm>
using namespace std;
#define N 10
void merge(int num[], int start, int middle, int end)
{
	if (start >= end)return;
	else {
		int lowbegin = start;
		int lowhigh = middle;
		int upbegin = middle + 1;
		int uphigh = end;
		int i = 0;
		int n = end - start + 1;
		while (lowbegin <= lowhigh && upbegin <= uphigh)
		{
			if (num[lowbegin] < num[upbegin])
				num[i++] = num[lowbegin++];
			else
				num[i++] = num[upbegin++];
		}
		if (lowbegin < lowhigh)num[i++] = num[lowbegin++];
		else
			num[i++] = num[upbegin++];
	}
}
void merge_sort(int num[], int start, int end)
{
	if (start == end)return;
	else {
		int middle = (start + end - 1) / 2;
		merge_sort(num, start, middle);
		merge_sort(num, middle, end);
		merge(num, start, middle, end);
	}
}
int main()
{
	int num[N];
	for (int i = 1; i <= N; i++)
		scanf_s("%d", &num[i]);
	//printf("\n");
	merge_sort(num, 1, 10);
	for (int i = 1; i <= N; i++)
		cout << num[i] << " ";
	cout << endl;
	return 0;
}
#include<stdio.h>
#include<stdlib.h>
#define N 10
#define MAX 10000

void merge(int num[], int p, int q, int r);
void merge_sort(int num[], int p, int r);

int main(void) {
	int num[N] ,i;
	printf("Please input %d numbers to sort(less than %d):\n", N, MAX);

	for (i = 0; i < N; i++)
		scanf_s("%d", &num[i]);

	merge_sort(num, 0, N - 1);

	for (i = 0; i < N; i++)
		printf("%d ", num[i]);
	printf("\n");

	//system("pause");
	return 0;
}
void merge(int num[], int p, int q, int r) {
	int n1, n2, L[N], R[N], i, j, k;
	// L means left and R means right
	n1 = q - p + 1;
	n2 = r - q;
	for (i = 0; i < n1; i++)
		L[i] = num[p + i];
	for (i = 0; i < n2; i++)
		R[i] = num[q + i + 1];
	L[n1] = MAX;//哨兵
	R[n2] = MAX;
	i = 0;
	j = 0;
	for (k = p; k <= r; k++) {
		if (L[i] <= R[j]) {
			num[k] = L[i];
			i++;
		}
		else {
			num[k] = R[j];
			j++;
		}
	}
}
void merge_sort(int num[], int p, int r) {
	int q;
	if (p < r) {
		q = (p + r) / 2;
		merge_sort(num, p, q);//分开
		merge_sort(num, q + 1, r);
		merge(num, p, q, r);
	}
}

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值