Daily Archives: 2015-12-20

归并排序MergeSort

归并排序是创建在归并上的一种有效排序方法,说人话就是将目标数组分成许多小数组,将小数组分别进行排序后,再将小数组有序合成大数组的排序方法,其比较次数介于(nlogn)/2nlogn-n+1之间【n为数组长度,各种复杂度详见百度百科
恩于是自己写了一个归并算法的头

#ifndef MERGESORT
#define MERGESORT
#endif
void MergeSort(int*,int,int);
void Merge(int* oriArr,int Arr_start,int Arr_end);

void Merge(int* oriArr,int Arr_start,int Arr_end) {
	int tempArr[Arr_end-Arr_end+1];
	int indexFirstArr=Arr_start,
	    indexSecondArr=(Arr_start+Arr_end)/2+1,
	    indexTempArr=Arr_start;

	while(indexFirstArr!=(Arr_start+Arr_end)/2+1&&indexSecondArr!=Arr_end+1)  //
		if(oriArr[indexFirstArr]>oriArr[indexSecondArr])
			tempArr[indexTempArr++]=oriArr[indexFirstArr++];
	//Automatically add 1 to indexes for being used in the next term of loop
		else
			tempArr[indexTempArr++]=oriArr[indexSecondArr++];

	while(indexFirstArr!=(Arr_start+Arr_end)/2+1)
		tempArr[indexTempArr++]=oriArr[indexFirstArr++];
	while(indexSecondArr!=Arr_end+1)
		tempArr[indexTempArr++]=oriArr[indexSecondArr++];
	//these two while loops add the left number to the tempArr
	for(int i=Arr_start;i<=Arr_end;i++)
		oriArr[i]=tempArr[i];
	return;
}

void MergeSort(int oriArr[],int Arr_start,int Arr_end) {
	if(Arr_start!=Arr_end) {
		int Arr_mid=(Arr_start+Arr_end)/2;
		MergeSort(oriArr,Arr_start,Arr_mid);
		MergeSort(oriArr,Arr_mid+1,Arr_end);
		Merge(oriArr,Arr_start,Arr_end);
	}
	return;
}