合并排序
合并排序是分治模式中的提出的一个排序方法。
分治模式在每一个递归中都有三个步骤:
分解(devide):将原问题分解成一系列子问题。
解决(Conquer):递归地解决各子问题。若子问题足够小,则直接求解。
合并(Combine):将子问题的结果合并成原问题的解。
合并排序的是通过分治法把一个无序数组分成n/2等分,这是分解步骤。然后每个等分是一个子问题,因为子问题足够小所以进入到解决。解决后就进入合并,因为递归的性质合并后的结果又变成一个子问题,再合并,最终合并到原问题的解。
合并算法的T(n) = n*log2.n
简单点儿看这个其实就是 max(每层比较次数)*深度。
T(n) = 2*T(n/2) + O(n)
时间复杂度描述图:
代码段:
/****************************merge sort partment*****************************/
//[l, q] U [q+1, r]
void LXWSORT::pri_merge(int arr[], int l, int r, int q, int sortflag)
{
int i = l;
int k = l;
int j = q+1;
while( i <= q && j <= r )
{
if( sortflag == 0 ) {
if( this->ptr_arr[i] < this->ptr_arr[j] ) {
arr[k++] = this->ptr_arr[i++];
} else {
arr[k++] = this->ptr_arr[j++];
}
} else {
if( this->ptr_arr[i] > this->ptr_arr[j] ) {
arr[k++] = this->ptr_arr[i++];
} else {
arr[k++] = this->ptr_arr[j++];
}
}
}//while
if( i > q ) {
for(j; j <= r; arr[k++] = this->ptr_arr[j++]);
} else {
for(i; i <= q; arr[k++] = this->ptr_arr[i++]);
}
//copy from arr to ptr_arr
for(i = l; i <= r; i++)
this->ptr_arr[i] = arr[i];
}
void LXWSORT::pri_merge_sort(int arr[], int l, int r, int sortflag)
{
if(l < r)
{
int q = (r+l)/2; //invide value
pri_merge_sort(arr, l, q, sortflag); //left
pri_merge_sort(arr, q+1, r, sortflag); //right
pri_merge(arr, l, r, q, sortflag); //combine
}
}
void LXWSORT::merge_sort(int sortflag)
{
int *temp_arr = new int[length];
pri_merge_sort(temp_arr, 0, length-1, sortflag);
delete[] temp_arr;
}
/************************************************************************/