并归排序非递归实现

来源:互联网 发布:电脑淘宝店招尺寸 编辑:程序博客网 时间:2024/05/17 22:38

因为并归排序是需要将子序列均排序好后,才能对父序列进行排序,与快排相反,所以这里借鉴二叉树后序遍历的非递归方法。


template <typename T>

void margeSort(T *target, T *src, int start, int mid, int end) {
for(int k = start; k <= end; k ++) {           //这里先将target中的内容复制给src
src[k] = target[k];
}
int i = start;
int j = mid  + 1;
int cnt = start;
while(i <= mid && j <= end) {
if(src[i] < src[j]) {
target[cnt ++] = src[i ++];
} else {
target[cnt ++] = src[j ++];
}
}
while(i <= mid) {
target[cnt ++] = src[i ++];
}
while(j <= end) {
target[cnt ++] = src[j ++];
}
}
//后序遍历
template <typename T>
void sort(T *list, int start_, int end_) {
if(list == NULL) {
return;
}
T buf[100];                 //这里是临时存放两个需要并归的序列
int start = start_;
int mid = -1;
int end = end_;
Data temp;
stack<Data> sta;
int flag = 0;
int startTemp = -1;
while(flag == 0 || sta.size() > 0) {
if(flag == 0) {                 //flag = 0时,数组可以再次细分
while(start < end) {
mid = start + (end - start) / 2;
sta.push(Data(start, mid, end));
end = mid;
}
startTemp = start;
}
temp = sta.top();
if(temp.mid + 1 != startTemp) {
start = temp.mid + 1;
end = temp.end;
flag = 0;
} else {
margeSort(list, buf, temp.start, temp.mid, temp.end);
sta.pop();
startTemp = temp.start;
flag = 1;
}
}
}
int main(void) {
//int a[] = {6, 4, 8, 10, 1, 1, 4, 8, 6};
int a[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
sort(a, 0, 9);
for(int i = 0; i < 10; i ++) {
cout << a[i] << endl;
}
return 0;
}
0 0
原创粉丝点击