数组的归并排序(不使用辅助空间,递归)

来源:互联网 发布:年终奖数据表免费数据 编辑:程序博客网 时间:2024/04/28 13:07
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 <= lastint i = first, j = mid + 1, temp;while(i < j && j <= last){//移动iwhile(i < j){if(data[i] <= data[j]) i++;else break;}if(i == j) break;//移动jtemp = j;while(j <= last){if(data[j] < data[i]) j++;else break;}//循环移动[i,temp)与[temp,j)RingShift(data, i, temp, j);//移动ii += 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);}

0 0
原创粉丝点击