快排注重如何分区,而归并分解随意,注重合并
void mergesort(int ar[],int p,int r) {//递归调用的左右边界
if (p < r) {
int mid = p + (p - r) << 1;
mergesort(ar, p, mid);//对左边进行排序
mergesort(ar, mid, r);//对右边进行排序
partition(ar);
}
}
void partition(int ar[]) {
int length = sizeof(ar) / sizeof(int);
int mid = mid / 2;
int current = 0, left = 0, right = mid + 1;
int* br;
strcpy(br, ar);
while (left <= mid && right <= length - 1) {
if (br[left] < br[right]) {
ar[current] = br[right];
current++; right++;
}
else {
ar[current] = br[left];
left++;
}
}
}
注:上图mid有错误
其中递归:
1.将序列每相邻两个数字进行归并操作,形成floor(n/2)个序列,排序后每个序列包含两个元素
2. 将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素
3. 重复步骤②,直到所有元素排序完毕