基本的递归排序
使用下面的归并方法,每次归并都使用一个额外数组,归并完之后再将有序的数组复制到目的数组中
/*归并A和B*/
void mergeAB(Item c[], Item a[], int N, Item b[], int M) {
int i, j, k;
for(i = 0, j = 0, k = 0; k < N + M; k++) {
if(i == N) {c[k] = b[j++]; continue;}
if(j == M) {c[k] = a[i++]; continue;}
if(a[i] < b[j]) c[k] = a[i++];
else c[k] = b[j++];
}
}
改进的递归排序1
改进归并方法,每次都使用一个额外数组来存储,再下面的函数中,使用额外数组aux来存储零时的待排序数组,存储待排序数组时候需要将start到mid之间的元素按照原来的顺序放在aux中,而mid到end之间的元素则按照原来的顺序的倒序存放与aux中
如待排序数组为:A R S T G I N
start = 0, mid = 3, end = 6
那么元素存放于aux中的顺序为:A R S T N I G
使用这种方式,则可以减少基本排序中的判断子序列是否已经到达末尾,即上面基本排序代码中的
if(i == N) {c[k] = b[j++]; continue;}
if(j == M) {c[k] = a[i++]; continue;}
这两个if语句。
/**
改进的归并方法,这样就可以减少检测是否到队尾的比较次数
*/
void merge(Item a[], int start, int mid, int end) {
int i, j, k;
Item *aux = (Item*)malloc(sizeof(Item) * (end-start+1));
for(i = mid + 1; i > start; i--) aux[i-1] = a[i-1];
for(j = mid; j < end; j++) aux[end+mid-j] = a[j+1];
for(k = start; k <= end; k++)
if(aux[i] < aux[j])
a[k] = aux[i++];
else
a[k] = aux[j--];
}
改进的递归排序2
第二种改进方法避免了排序完之后的复制操作
#include <stdio.h>
#include <stdlib.h>
typedef char Item;
void mergeAB(Item c[], Item a[], int N, Item b[], int M);
void mergeSortAB(Item a[], Item b[], int l, int r);
void mergeSort(Item a[], int l, int r);
void main() {
int i;
Item a[] = {'A', 'R', 'S', 'T', 'G', 'I', 'N'};
Item b[7];
mergeSort(a, 0, 6);
for(i = 0; i < 7; i++) {
printf("%4c", a[i]);
}
}
void mergeSort(Item a[], int l, int r) {
int i;
Item *aux = (Item*)malloc(sizeof(Item) * (r-l+1));
for(i = 0; i < (r-l+1); i++) {
aux[i] = a[i];
}
mergeSortAB(a, aux, l, r);
}
/*排序A,使用B作为辅助数组,然后在子调用中交换A,B的作用*/
void mergeSortAB(Item a[], Item b[], int l, int r) {
if(r <= l) return;
int m = (r + l) / 2;
mergeSortAB(b, a, l, m);
mergeSortAB(b, a, m+1, r);
mergeAB(a+l, b+l, (m-l)+1, b+m+1, r-m);
}
/*归并A和B*/
void mergeAB(Item c[], Item a[], int N, Item b[], int M) {
int i, j, k;
for(i = 0, j = 0, k = 0; k < N + M; k++) {
if(i == N) {c[k] = b[j++]; continue;}
if(j == M) {c[k] = a[i++]; continue;}
if(a[i] < b[j]) c[k] = a[i++];
else c[k] = b[j++];
}
}
相关推荐
然而,题目中提到的“改进的归并排序算法”探讨了两种不同的实现方式:不回写和非递归。 1. **不回写方式**: 在传统的归并排序中,排序过程中会涉及到数组元素的来回移动。不回写是指在排序过程中避免对原始数组...
以下是关于"插入排序、选择排序、希尔排序、堆排序、冒泡、双向冒泡、快速排序、归并排序、递归的归并排序、基数排序"这十大经典排序算法的详细解释: 1. 插入排序:插入排序是一种简单的排序算法,它通过构建有序...
快速排序、归并排序、改进的归并排序算法的C++代码。(含测试用例,代码逻辑清晰可运行。) (划分子区间,分别对左右子区间进行排序,开始归并已经排好序的low到high之间的数据。改进后的归并排序对数组元素下标...
本文将详细介绍C++中实现的希尔排序、快速排序、堆排序和归并排序这四种经典排序算法。 希尔排序,由Donald Shell于1959年提出,是一种改进的插入排序。它的基本思想是通过设置一个增量序列,将待排序的元素按照...
以下是关于"冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序"这七种常见排序算法的源码实现及相关知识点的详细解释: 1. **冒泡排序**:冒泡排序是一种简单的排序算法,它重复地遍历待排序的...
这里,我们重点讨论五种经典的排序算法:快速排序、改进快速排序、希尔排序、归并排序和插入排序。这五种排序算法各有特点,适用于不同的场景,并且在实际编程中被广泛应用。 快速排序是一种高效的排序算法,由英国...
在计算机科学领域,排序算法是数据处理中至关...归并排序和堆排序在稳定性及处理大数据量上表现良好;插入排序和希尔排序在部分有序数据时有优势。理解并掌握这些排序算法,对于编程和算法设计能力的提升有着重要作用。
快速排序、堆排序、归并排序和希尔排序是四种经典的排序算法,它们在计算机科学中有着广泛的应用。这里我们将深入探讨这些排序算法的原理、实现方式以及它们在C++编程中的应用。 **快速排序(Quick Sort)** 快速...
本篇将详细探讨快速排序、希尔排序和归并排序这三种在C语言中常见的排序算法。 首先,我们来看快速排序(Quick Sort)。快速排序由C.A.R. Hoare在1960年提出,其基本思想是分治法。它的核心是选择一个基准元素,...
### 链表操作 ...此外,还深入解析了快速排序和归并排序的实现细节,这两种排序算法都是计算机科学中非常重要的算法,广泛应用于各种场景。通过对这些知识点的学习,可以进一步提高对数据结构和算法的理解。
9. **递归的归并排序**:归并排序的实现方式之一,直接使用递归调用自身来完成数组的划分和合并过程,其基本思想与归并排序一致。 10. **基数排序**(Radix Sort):一种非比较型整数排序算法,其原理是将整数按...
本文将深入探讨Java编程语言中实现的七种主要排序算法:直接插入排序、希尔排序、选择排序、堆排序、冒泡排序、快速排序以及归并排序。每种算法都有其独特性,适用于不同的场景和数据特性。 1. **直接插入排序**:...
- 在C#中,归并排序通常用递归实现,通过两个辅助数组进行合并操作。 7. **基数排序**(Radix Sort): - 基数排序不是比较型排序,而是利用数字的位数进行排序。从低位到高位,对每个位数进行一次分配排序,如桶...
下面将详细讲解这7种排序算法:快速排序、归并排序、插入排序、选择排序、冒泡排序、堆排序以及希尔排序。 1. **快速排序**:由C.A.R. Hoare提出的,采用分治策略。基本思想是选取一个基准元素,通过一趟排序将待...
这里我们汇总了七种常见的排序算法:Shell排序、归并排序、选择排序、快速排序、堆排序、冒泡排序和插入排序。每种算法都有其独特的特点和适用场景,下面将逐一详细介绍。 1. **Shell排序**:由Donald Shell提出,...
对于归并算法的四点改进 1.不回写,可以减少一半的数组移动 2.不递归 ,可以加快执行速度 3.无逆序,分段的时候递增的为一段,段数不确定 ...4.与插入相结合,因为数列个数在16以内的话插入排序会比归并排序要快
本篇将详细介绍标题所提及的四种排序算法:Shell排序、快速排序、归并排序以及堆排序。 1. **Shell排序**: Shell排序是一种改进的插入排序,由Donald Shell于1959年提出。它通过设置一个间隔序列,使得数组中的...
归并排序(Merge Sort)、改进的归并排序(Improved Merge Sort)和快速排序(Quick Sort)是计算机科学中三种常见的排序算法,它们在处理大量数据时具有高效性和稳定性。这三种算法各有特点,适用于不同的场景。 ...
总结起来,多路归并之根号n排序是对传统归并排序的一种改进,通过改变划分策略降低了递归深度,提高了处理大数据的效率。在理解和实现这个算法时,需要注意合理地划分数组,高效地进行多路归并,以及根据实际情况...
本文将深入探讨如何使用C++生成随机数,以及如何应用四种不同的排序算法——冒泡排序、快速排序、归并排序和希尔排序,并分析它们的执行时间。 首先,让我们关注如何在C++中生成随机数。C++标准库提供了`<random>`...