排序算法 两路合并排序

两路合并排序是另一类时间复杂度为O(n* log2 n)的排序方法。基本思想:将有n个元素的序列看成是n个长度为1的有序序列,然后两两合并序列,得到 n/2个长度为2或1的有序序列,然后在进行两两合并,直到得到一个长度为n的有序序列。

两路合并算法需要O(n)的空间。


int A[7] = {99,36,68,72,12,48,02};
void Merge(int *p,int i1,int j1,int i2,int j2){
	int *t = new int[j2-i1+1];
	int i = 0;
	int j = i1;
	while(i1 <= j1 && i2 <= j2){
		if(p[i1] < p[i2])
			t[i++] = p[i1++];
		else
			t[i++] = p[i2++];
	}
	while (i1 <= j1)
		t[i++] = p[i1++];
	while (i2 <= j2)
		t[i++] = p[i2++];
	for(i = 0;j <= j2;j++)
		p[j] = t[i++];
	delete[] t;
}
void MergeSort(int *p,int plength){
	int i1,j1,i2,j2,n = plength;
	int size = 1;
	while(size < n){
		i1 = 0;
		while(i1 + size < n){//当i1的右端+1不为n时,则存在2个序列,进行合并
			j1 = i1 + size - 1;
			i2 = j1 + 1;
			if(i2 + size > n-1)
				j2 = n-1;
			else
				j2 = i2 + size -1;
			Merge(p,i1,j1,i2,j2);
			i1 = j2 + 1;
		}
		size *= 2;
	}
}
int main()
{
	MergeSort(A,7);
	return 0;
}


你可能感兴趣的:(C++,学习,排序算法)