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),因此占用的空间较多。