归并排序:
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。
时间复杂度:
O(N*lgN)
空间复杂度:
O(N) 需要额外空间
性能:
稳定
例:
步骤:
1.主要经历了两个阶段,一个是将无序区间分割成一个一个小区间
2.将分割的小区间依次归并成一个有序的区间
PS:
归并的数据保存在临时空间,最后将临时空间的数据拷贝回原数组,即实现归并。
时间复杂度:
O(N*lgN)
空间复杂度:
O(N) 需要额外空间
性能:
稳定
例:
步骤:
1.主要经历了两个阶段,一个是将无序区间分割成一个一个小区间
2.将分割的小区间依次归并成一个有序的区间
PS:
归并的数据保存在临时空间,最后将临时空间的数据拷贝回原数组,即实现归并。
void Merge(int* temp, int* arr, int left, int right);
void MergeSort(int* arr, size_t n)
{
assert(arr);
int* temp = new int[n]; //开辟同样大小的临时空间
assert(temp);
int i = 0;
for (i = 0; i < n; ++i)
{
temp[i] = 0; //初始化
}
Merge(temp, arr, 0, n-1); //闭区间
delete[] temp;
}
//归并排序
void Merge(int* temp, int* arr, int left, int right)
{
int mid = left + ((right - left) >> 1);
if (left >= right)
{
return;
}
Merge(temp, arr, left, mid); //分割左区间
Merge(temp, arr, mid+1, right); //分割右区间
//此时走到这里,arr已经被划分为一个个小区间
//归并到临时区间
int begin1 = left;
int end1 = mid;
int begin2 = mid+1;
int end2 = right;
int index = 0;
while ((begin1 <= end1) && (begin2 <= end2))
{
//两个区间的值做比较,按从小到大排列
if (arr[begin1] <= arr[begin2])
{
temp[index++] = arr[begin1++]; //此时begin1中的值小,所以先将该数据插入temp
}
else if (arr[begin1] > arr[begin2])
{
temp[index++] = arr[begin2++];
}
}
//出了该循环,可能是一个条件不满足,或者是两个都不满足,需要判断
//而且不可能两个条件都满足,所以先后顺序无影响
while (begin1 <= end1)
{
temp[index++] = arr[begin1++];
}
while (begin2 <= end2)
{
temp[index++] = arr[begin2++];
}
//此时,数组元素已经全部排序完毕,需要拷贝回原数组
int i = 0;
for (i = 0; i < index; ++i)
{
arr[left+i] = temp[i];
cout << arr[left+i]<<" ";
}
cout << endl;
}
void Test()
{
int arr[] = { 1, 5, 7, 0, 9, 3, 222, 67, 89, 56, 32, 12 };
size_t n = sizeof(arr) / sizeof(arr[0]);
MergeSort(arr, n);
}
int main()
{
Test();
system("pause");
return 0;
}