軟件設計師算法之分治法--歸併排序

    最近準備要考中級軟件設計師。該門考試涉及到算法相關的,剛好也順帶着整理下之前自己學習過的知識。

    算法的學習沒有什麼捷徑,就是理解算法思想和邏輯。最重要的一點,一定要自己編寫代碼,調試通過,這樣纔算是完成了算法的學習。

     2路歸併排序就是每次都劃分數組爲前後2半,對這2半再次劃分爲2半,如此遞歸劃分之後只剩下1個元素。1個元素當然是有序的,這時候遞歸也是到了最底層,接着就是開始向上歸併了。歸併的時候就是把前一半元素(有序的)和後一半元素(有序的)進行插入排序。一直歸併到數組全部有序,如此就完成了整個排序過程。

     編寫的代碼如下:

     

static void Merge(int dataSrc[],int start,int mid,int end)
{
	int frontIndex = 0;
	int rearIndex = 0;
	int dstIndex = start;

	/* 如果不申請臨時空間,那麼每次歸併插入數據的時候可能會移動大量數據*/
	int* pTempFront = (int*)new int[mid-start+1];
	int* pTemRear = (int*)new int[end-mid];

	memcpy(pTempFront,&dataSrc[start],sizeof(int)*(mid-start+1));
	memcpy(pTemRear,&dataSrc[mid+1],sizeof(int)*(end-mid));

	for(frontIndex=0,rearIndex=0;(frontIndex<(mid-start+1))&&(rearIndex<(end-mid));)
	{
		if(pTempFront[frontIndex] > pTemRear[rearIndex])
		{
			dataSrc[dstIndex++] = pTemRear[rearIndex++];
		}
		else
		{
			dataSrc[dstIndex++] = pTempFront[frontIndex++];
		}
	}
	for(;frontIndex<(mid-start+1);frontIndex++)
	{
		dataSrc[dstIndex++] = pTempFront[frontIndex];
	}

	for(;rearIndex<(end-mid);rearIndex++)
	{
		dataSrc[dstIndex++] = pTemRear[rearIndex];
	}

	delete []pTempFront;
	delete []pTemRear;
}

void static MergeSortHelp(int dataSrc[],int start,int end)
{
	if(start < end)
	{
		int mid = (start+end)/2;
		MergeSortHelp(dataSrc,start,mid);
		MergeSortHelp(dataSrc,mid+1,end);
		Merge(dataSrc,start,mid,end);
	}
}

void MergeSort(int data[],int dataLen)
{
	MergeSortHelp(data,0,dataLen-1);
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章