排序方法
归并排序
基本原理
(1)把数组从中间划分成两个子数组;
(2)递归地把子数组划分成更小的子数组,直到子数组里面只有一个元素;
(3)接着将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤;
代码实现
//合并过程
void merge(vector<int> &arr,int start,int mid,int end)
{
int i=start;
int j=mid+1;
int k=0;
vector<int> res(arr.size(),0);
//类似双指针法,将小的数依次放入result
while(i<=mid && j<=end)
{
if(arr[i]<=arr[j])
{
res[k++]=arr[i++];
}
else if(arr[i]>=arr[j])
{
res[k++]=arr[j++];
}
}
while(i<=mid)
{
res[k++]=arr[i++];
}
while(j<=end)
{
res[k++]=arr[j++];
}
for(int i=0;i<k;i++) //i<k,k代表是个数
{
arr[start+i]=res[i]; // copyback回arr
/*第一次mergesort后result
30 80 0 0 0 0 0 对应k=2
第二次 40 60 0 0 0 0 0 k=2
第三次 30 40 60 80 0 0 0 0 k=4*/
}
}
//递归拆分排序
void mergesort(vector<int> &arr,int start,int end)
{
if(arr.size()==0 || start>=end)
{
return;
}
int mid=(start+end)/2;
mergesort(arr,start,mid);
mergesort(arr,mid+1,end);
merge(arr,start,mid,end);
}