09-排序2 Insert or Merge

#include<stdlib.h>
#include<stdio.h>

int isSame(int *a, int *b, int length) {
	int m = 0;
	for (int i = 0; i < length; i++)
	{
		if (a[i] != b[i]) {
			m = 1;
		}
	}
	if (!m) {
		return 1;
	}
	else {
		return 0;
	}
}

//归并
void sort(int *a, int *b, int left, int right,int center) {
	if (left < right) {
		int Center = center;
		int A = left;
		int B = Center + 1;
		int K = left;
		while (A != Center + 1 && B != right + 1)
		{
			if (a[A] < a[B]) {
				b[K++] = a[A++];
			}
			else {
				b[K++] = a[B++];
			}
		}
		while (A != Center + 1) {
			b[K++] = a[A++];
		}
		while (B != right + 1)
		{
			b[K++] = a[B++];
		}
		for (int i = left; i <= right; i++)
		{
			a[i] = b[i];
		}
	}
}



int main()
{
	int n, m;
	scanf("%d\n", &n);
	int flag = 0;
	int a[101];
	int aa[101];
	int b[101];
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
		aa[i] = a[i];
	}
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &b[i]);
	}
	int temp;
	
	for (int i = 0; i < n; i++)
	{
		if (isSame(a, b, n)) {
			flag = 1;
			printf("Insertion Sort\n");
			int L;
			if (i == 0) {
				L = 2;
			}
			else {
				L = i;
			}
			if (L < n) {
				temp = a[L];
				for (int j = 0; j < L; j++)
				{
					if (a[j] > a[L]) {
						int z;
						for (z = L - 1; z >= j; z--)
						{
							a[z + 1] = a[z];
						}
						a[j] = temp;
						break;
					}
				}
			}
			for (int m = 0; m < n; m++)
			{
				printf("%d", a[m]);
				if (m != n - 1) {
					printf(" ");
				}
			}
			break;
		}
		temp = a[i];
		for (int j = 0; j < i; j++)
		{
			if (a[j] > a[i]) {
				int z;
				for (z = i-1; z >= j; z--)
				{
					a[z + 1] = a[z];
				}
				a[j] = temp;
				break;
			}
		}
	}
	if (flag == 0) {
		int c[101];
		printf("Merge Sort\n");
		int length = 1;
		while (length<n)
		{
			int i = 0;
			if (isSame(aa, b, n)) {
				i = 0;
				length *= 2;
				for (i = 0; i + length - 1 < n;)
				{
					sort(aa, c, i, i + length - 1, (i + i + length - 1) / 2-1);
					i += length;
				}
				if (n - i > length / 2) {
					sort(aa, c, i, n - 1, i + length / 2);
				}
				for (int m = 0; m < n; m++)
				{
					printf("%d", aa[m]);
					if (m != n - 1) {
						printf(" ");
					}
				}
				break;
			}
			i = 0;
			length *= 2;
			for (i = 0; i + length - 1 < n;)
			{
				sort(aa, c, i, i + length - 1,(i+i+length-1)/2);
				i += length;
			}
			if (n - i > length / 2) {
				sort(aa, c, i, n-1,i+length/2-1);
			}
			if (isSame(aa, b, n)) {
				i = 0;
				length *= 2;
				for (i = 0; i + length - 1 < n;)
				{
					sort(aa, c, i, i + length - 1, (i + i + length - 1) / 2);
					i += length;
				}
				if (n - i > length / 2) {
					sort(aa, c, i, n - 1, i + length / 2-1);
				}
				for (int m = 0; m < n; m++)
				{
					printf("%d", aa[m]);
					if (m != n - 1) {
						printf(" ");
					}
				}
				break;
			}
		}
	}

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_29718605/article/details/80262083