数据结构----归并排序(C语言)

归并排序与基于交换、选择等排序的思想不一样。“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。假定待排序表含有n个记录,则可以看成是n个有序的子表,每个表长度为1,然后两两归并,得到(n/2)个长度为2或1的有序表;再两两归并,如此重复,直到合并成一个长度为n的有序表为止。这种排序方法称为2-路归并排序。

时间复杂度为O(nlog2n)

#include 
#include 
#define maxSize 100
int R[maxSize] = { 0 };
int count = 0;
/*********输入数据*********/
void Indata()
{
	printf("请输入整数数据(按回车键停止输入):");
	int i = 0;
	char ch;
	while (1)
	{
		scanf_s("%d", &R[i]);
		i++;
		count++;
		ch = getchar();
		if ('\n' == ch)
			break;
	}
}

/*********将前后相邻的两个有序表归并成一个有序表******/
void Merge(int r[],int low,int mid,int high)
{
	int i, j, k;
	int n1 = mid - low + 1;
	int n2 = high - mid;
	int L[maxSize],M[maxSize];
	for (i = 0; i < n1; i++)
		L[i] = r[low + i];

	for (j = 0; j < n2; j++)
		M[j] = r[mid + 1 + j];
		
	i = 0; j = 0; k = low;
	while (i < n1 && j < n2)
	{
		if (L[i] <= M[j])
			r[k] = L[i++];
		else
			r[k] = M[j++];
		k++;
	}
	while (i < n1)
		r[k++] = L[i++];
	while (j < n2)
		r[k++] = M[j++];
}

void MergeSort(int r[],int low,int high)
{
	if (low < high)
	{
		int mid = (low + high) / 2;    //从中间划分两个子序列
		MergeSort(r, low, mid);
		MergeSort(r, mid + 1, high);
		Merge(r, low, mid, high);
	}
}

void Print(int r[],int n)
{
	printf("归并排序后序列为:");
	for (int i = 0; i < n; i++) {
		printf("%d ", r[i]);
	}

}
void main()
{
	Indata();
	MergeSort(R, 0, count - 1);
	Print(R, count - 1);
	system("pause");
}

你可能感兴趣的:(数据结构----归并排序(C语言))