排序算法–归并排序
那这里大家有疑问了,那我们怎么将两个排序好的数组防到一块就有序呢
我们是要开辟一个全新的数组哦,用来保存我们排序好的数组;
我们这里设置两个指针一个指向第一个数组的头部,一个指向第二个数组的头部,然后比较,将较小的数字放置在开辟的数组中,然后放入元素的数组的指针+1;开辟的数组的指针也要+1哦;
最后将开辟的数组copy给原数组哦,这样就完成了归并排序;
这里演示代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
void MyCopy(int *src,int *ptr,int left,int right)
{
for(int i=left;i<=right;i++)
{
src[i]=ptr[i];
}
}
void MergeS(int arr[],int tmp[],int first,int mid,int end)
{
//每趟的排序
int i=first;//i表示左小组的第一个元素
int j=mid+1;//j表示右小组的第一个元素
int k=first;//tmp中 当前小组排序存放的起始位置
while(i<mid+1 && j<end+1)//左小组越界 右小组越界
{
//左右小组都没有越界
if(arr[i]<=arr[j])
{
tmp[k]=arr[i];//将小元素放入tmp中
i++;
k++;
}
else
{
tmp[k]=arr[j];
j++;
k++;
}
}
while(j<end+1)
{
//右小组没有越界
tmp[k++]=arr[j++];
}
while(i<mid+1)
{
//左边小组没有越界
tmp[k]=arr[i];
k++;
i++;
}
}
void Merge(int arr[],int tmp[],int first,int end)
{
//分 直到数组只剩下一个元素
if(first<end)
{
//至少有两个元素
int mid=(first+end)/2;
Merge(arr,tmp,first,mid);
Merge(arr,tmp,mid+1,end);
MergeS(arr,tmp,first,mid,end);
MyCopy(arr,tmp,first,end);
}
}
void MergeSort(int arr[],int len)
{
int *tmp=new int[len];
Merge(arr,tmp,0,len-1);
delete []tmp;
}
void Print(int arr[],int len)
{
int i=0;
for(;i<len;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
}
int main()
{
int arr[]={3,1,7,5,2,4,9,6};
int len=sizeof(arr)/sizeof(int);
Print(arr,len);
MergeSort(arr,len);
Print(arr,len);
return 0;
}
归并排序是稳定排序,它也是一种十分高效的排序
时间复杂度:O(n log n)
空间复杂度:O(n)