您的位置:首页 > 其它

归并排序

2015-07-21 23:54 387 查看
1、归并排序算法描述:

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

归并过程为:取待排序区间a[left~right]的中间点mid作为分隔点,将中间点左边序列(left~mid)用i索引,右边序列(mid+1~right)用j索引,比较a[i]和a[j]的大小,若a[i]≤a[j],则将左边有序表中的元素a[i]复制到临时数组tmp[k](大小为right-left+1)中,并令i和k分别加上1;否则将右边有序表中的元素a[j]复制到tmp[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到tmp中从下标k到下标right-left的单元。递归该过程,即是归并排序。
2、归并排序算法实现:

#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//递归实现归并排序
void mergeSort(int theArray[], int low, int high) 
{
	if(low >= high)
		return;
	int mid = (low + high) / 2;
	
	mergeSort(theArray, low, mid);                 //使得mid左边有序,包括mid 
	mergeSort(theArray, mid+1, high);              //使得mid右边有序 
	
	int tmpArray[high - low + 1];                  //临时数组,大小是high-low+1 
	int k;
	int i = low;
	int j = mid+1;
	k = 0;
	while(i <= mid && j <= high)
	{
		if(theArray[i] <= theArray[j])
		{
			tmpArray[k++] = theArray[i++]; 
		}
		else if(theArray[i] > theArray[j])
		{
			tmpArray[k++] = theArray[j++];
		}
	}

	while(j <= high)
		tmpArray[k++] = theArray[j++];
	while(i <= mid)
		tmpArray[k++] = theArray[i++];
	
	for(k = 0, i=low; k <= high-low, i <= high;)    //将临时数组中已经排好顺序的序列映射到theArray的low~high段 
	{                                              //使得theArray数组中low~high段有序 
		theArray[i++] = tmpArray[k++];
	}
}

void printArray(int theArray[], int n)
{
	if(theArray == NULL)
		return;
	for(int i = 0; i < n; ++i)
	{
		std::cout << theArray[i] << " ";
	}
	std::cout << std::endl;
}

int main(int argc, char *argv[]) {
	int myArray[] = {23, 18, 5, 78, 22, 33, 54, 9, 7};
	int length = sizeof(myArray) / sizeof(myArray[0]);
	mergeSort(myArray, 0, length-1);
	printArray(myArray, length);
	return 0;
}


3、算法时间复杂度和空间复杂度

归并排序的最好、最坏、平均时间复杂度均是O(nlogn).

空间复杂度是O(n),因此占用的空间较多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: