#include "stdio.h"
void guibin_sort(int arr[],int s,int e)
{
if(s>=e)
return;
int mid = (s+e)*0.5;
guibin_sort(arr,s,mid);
guibin_sort(arr,mid+1,e);
int len = e-s+1;
int arr_temp[len];
int i=s,j=mid+1,k=0;
while(i<=mid && j<=e)
{
if(arr[i]<=arr[j]) // 升序排序,稳定,相等时左边在前
arr_temp[k++] = arr[i++];
else
arr_temp[k++] = arr[j++];
}
// 补充
if(i>mid)
while(j<=e)
arr_temp[k++] = arr[j++];
else
while(i<=mid)
arr_temp[k++] = arr[i++];
// 回填
for(int m = 0;m<len;m++)
arr[s+m] = arr_temp[m];
}
int main(int argc,char* argv[])
{
int arr[]={3,1,4,1,5,9,2,6};
int len = sizeof(arr)/sizeof(arr[0]);
guibin_sort(arr,0,len-1);
for(int i = 0;i<len;i++)
printf("%d ",arr[i]);
printf("\n");
}
#include<iostream>
#include<vector>
using namespace std;
void guibing_sort(vector<int> &arr,size_t istart,size_t iend){
if(istart>=iend)
return;
size_t imid((istart+iend)*0.5);
guibing_sort(arr,istart,imid);
guibing_sort(arr,imid+1,iend);
// 深度遍历最底层是两个元素
vector<int> arrtmp(iend-istart+1,0);
size_t i(istart),j(imid+1); // index of arr[istart:imid]、arr[imid+1:iend]
size_t k(0); // index of arrtmp
while(i<=imid && j<=iend){
if(arr[i]<=arr[j]) // 稳定排序,arr[i]=arr[j]时也先压arr[i]
arrtmp[k++]=arr[i++];
else
arrtmp[k++]=arr[j++];
}
if(i<=imid){
while(i<=imid)
arrtmp[k++]=arr[i++];
}
if(j<=iend){
while(j<=iend)
arrtmp[k++]=arr[j++];
}
for(size_t l(istart),q(0);l<=iend;l++,q++)
arr[l]=arrtmp[q];
return;
}
int main(int argc,char *argv[]){
vector<int> arr={3,1,4,1,5,9,2,6};
guibing_sort(arr,0,arr.size()-1);
for(size_t i(0);i<arr.size();i++)
cout<<arr[i]<<' ';
cout<<endl;
}