归并排序,无法顺序答应出来的原因是什么
#include<stdio.h>
#include<stdlib.h>
#define N 7
typedef int ElemType;
//合并两个有序数列
void Marge(ElemType *A,int low,int mid,int high){
//1.定义分割开部分前一半的遍历元素,后一半的遍历元素,和新空间的遍历元素
int i,j,k;
//2.申请新空间
static ElemType B[N];
//3.将A中的元素全部放入B中
for(i=low;i<high;i++){
B[i] = A[i];
}
//4.判断入队
k = low;
for(i=low,j=mid+1;i<=mid && j<=high;k++){
if(B[i] <= B[j]){
A[k] = B[i];
i++;
}else{
A[k] = B[j];
j++;
}
}
//5.将最后一个数组中有剩余的元素放入
while(i<=mid){
A[k] = B[i];
i++;
k++;
}
while(j<=high){
A[k] = B[j];
j++;
k++;
}
}
//归并排序
void MargeSort(ElemType *A,int low ,int high){
//1.递归结束的条件
if(low<high){
int mid = (high+low)/2;
//不断递归分割
MargeSort(A,low,mid);//排序好前一半
MargeSort(A,mid+1,high);//排序好后一半
//合并函数
Marge(A,low,mid,high);
}
}
void print_Table(ElemType *A){
int i;
for(i=0;i<N;i++){
printf("%3d",A[i]);
}
printf("\n");
}
int main(){
int A[N] ={49,38,65,97,76,13,27};
print_Table(A);
MargeSort(A,0,6);
print_Table(A);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
// 合并两个有序数列
void Merge(ElemType *A, int low, int mid, int high) {
int i, j, k;
ElemType *B = (ElemType *)malloc((high - low + 1) * sizeof(ElemType)); // 动态分配新空间
// 将A中的元素全部放入B中
for (i = low; i <= high; i++) {
B[i - low] = A[i];
}
// 判断入队
k = low;
for (i = low, j = mid + 1; i <= mid && j <= high; k++) {
if (B[i - low] <= B[j - low]) {
A[k] = B[i - low];
i++;
} else {
A[k] = B[j - low];
j++;
}
}
// 将最后一个数组中有剩余的元素放入
while (i <= mid) {
A[k] = B[i - low];
i++;
k++;
}
while (j <= high) {
A[k] = B[j - low];
j++;
k++;
}
free(B); // 释放动态分配的内存
}
// 归并排序
void MergeSort(ElemType *A, int low, int high) {
// 递归结束的条件
if (low < high) {
int mid = (high + low) / 2;
// 不断递归分割
MergeSort(A, low, mid); // 排序前一半
MergeSort(A, mid + 1, high); // 排序后一半
// 合并函数
Merge(A, low, mid, high);
}
}
void print_Table(ElemType *A, int size) {
int i;
for (i = 0; i < size; i++) {
printf("%3d", A[i]);
}
printf("\n");
}
int main(){
int A[N] ={49,38,65,97,76,13,27};
print_Table(A, 7);
MargeSort(A,0,6);
print_Table(A, 7);
return 0;
}
for(i=low;i<=high;i++){
B[i] = A[i];
}
只要修改3.将A中的元素全部放入B中,即可。
遍历时未将最后一位元素存入B中
不断将数组一分为二,递归成一个个的子数组,得到最小子数组的排序,并合并:
1. 申请两个空间存放子序列数据,子序列是排好序的
2. 设定两个指针,分别指向两个序列的起始位置
3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
4. 重复步骤3直到某一指针超出序列尾,将另一序列剩下的所有元素直接复制到合并序列尾。
合并的过程其实就是将两个有序数组合并为一个有序数组。