void MergeSortCore(int* data, int first, int last);
void RingShift(int* data, int begin, int mid, int end);
void MergeSort(int* data, int length)
{
if(data == NULL || length <= 0) return;
MergeSortCore(data, 0, length-1);
}
void MergeSortCore(int* data, int first, int last)
{
if(first == last) return;
int mid = first + (last - first)/2;
MergeSortCore(data, first, mid);
MergeSortCore(data, mid+1, last);
//循环不变式:data[first,i)有序;i < j;j <= last
int i = first, j = mid + 1, temp;
while(i < j && j <= last)
{
//移动i
while(i < j)
{
if(data[i] <= data[j]) i++;
else break;
}
if(i == j) break;
//移动j
temp = j;
while(j <= last)
{
if(data[j] < data[i]) j++;
else break;
}
//循环移动[i,temp)与[temp,j)
RingShift(data, i, temp, j);
//移动i
i += j - temp;
}
}
void swap(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
}
//反转data[first,last]
void reverse(int* data, int first, int last)
{
if(data == NULL) return;
while(first < last)
swap(data[first++], data[last--]);
}
//data[begin,mid)和data[mid,end)两部分交换位置
void RingShift(int* data, int begin, int mid, int end)
{
if(data == NULL) return;
reverse(data,begin,mid-1);
reverse(data,mid,end-1);
reverse(data,begin,end-1);
}
数组的归并排序(不使用辅助空间,递归)
最新推荐文章于 2021-08-21 16:59:55 发布