归并排序的C++实现

来源:互联网 发布:plc编程及应用 第4版 编辑:程序博客网 时间:2024/05/16 00:54

生活就像二进制,不是零就是一!也许和中国的一个成语有相同的含义吧----成王败寇!


/*此方法可以用于负数在内的数组排序,归并排序用于将数组分组排序后再合并,
而合并是归并排序一个重要的步骤。可以理解为两个已经排序了的数组,从最小的
下标开始比较两个数组该位置的元素大小,将小的元素存入到临时数组中,并将该
下标加一,依次完成,知道没有可以比较为止,然后将剩下的数组的元素复制到该
临时数组,最后将临时数组的元素依次复制给输入的数组。归并排序的运行需要给
一定的存储空间存储临时数据,然后多次赋值!时间复杂度为O(nlgn),空间复杂度
为O(n).为稳定排序,因为两个相同元素的相对位置不会因为比较而改变!
*/

#include<iostream>
#include<ctime>
#include<cstdio>
using namespace std;
const int ArrSize = 100;
void MergeSort(int * arr, int start,int end);
void Merge(int * arr, int start, int end);
void Show(int * arr, int length);
int main()
{
int m[ArrSize] = { 0 };
srand(time(0));
for (int i = 0; i < ArrSize; ++i)
m[i] = rand();
m[55] = 1626261;
m[26] = -99;
Show(m,ArrSize);
MergeSort(m,0, ArrSize-1);
Show(m, ArrSize);
return 0;
}
void MergeSort(int * arr, int start, int end)
{
if (end - start <= 0)return;//如果数组只有一个元素或者输入start和end有误,将不做操作
else
{
int mid = (end +start) / 2;//设置中点位置
MergeSort(arr, start,mid);//对前半部分数组排序
MergeSort(arr, mid+1,end);//对后半数组排序
Merge(arr, start, end);//合并前面两个排序后的子数组

}
}
void Merge(int * arr, int start, int end)
{
int mid = (end + start) / 2;//找到中点,合并前分数组一样
int i = 0;
int j1 = start;
int j2 = mid + 1;
int * temp = new int[end-start+1];//new出来的数组大小为end-start+1,恰好是输入数组大小,足以存储排序后的数组、此处出现异常,数组给的大小有问题
//http://zhidao.baidu.com/link?url=X9uyWqljR7ESsnAR8o0KHe0heGhZMcPuwxFapaYp3mJH2_gl6MfVmsKSM5lgEXlBzpiV3ry2Unc2Lsqnnb73Sa,在这个链接找到解决方法
while (j1 <= mid&&j2 <= end)//如果两个子数组都还有元素,把其中小的元素存入到临时数组
{
if (arr[j1] <= arr[j2])
temp[i++] = arr[j1++];
else
temp[i++] = arr[j2++];
}
while ((mid-j1)>=0&&j2>end)//当后半数组都存到临时数组而前半数组还有元素时,
temp[i++] = arr[j1++];//依次把剩余元素存入到临时数组中
while ((end-j2)>= 0 && j1>mid)//同上理
temp[i++] = arr[j2++];
for (int i = 0; i <= end - start; ++i)//将临时数组数据复试到原数组中
arr[start + i] = temp[i];
Show(arr, end -start + 1);
delete [] temp;//new 为数组,delete也应为delete[];
}
void Show(int * arr, int length)
{
if (length <= 0)return;
else
{
int i = 0;
cout << "The array is :\n";
while (i < length)
cout << arr[i++] << "\t";
}
cout << endl;
}

0 0
原创粉丝点击