基本的递归排序
使用下面的归并方法,每次归并都使用一个额外数组,归并完之后再将有序的数组复制到目的数组中
/*归并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++];
}
}
相关推荐
快速排序、归并排序、改进的归并排序算法的C++代码。(含测试用例,代码逻辑清晰可运行。) (划分子区间,分别对左右子区间进行排序,开始归并已经排好序的low到high之间的数据。改进后的归并排序对数组元素下标...
改进的归并排序算法,两种方式 1 是不回写, 2是 非递归
快速排序 改进快速排序 希尔排序 归并排序 插入排序演示程序,源码,enjoy it
对于归并算法的四点改进 1.不回写,可以减少一半的数组移动 2.不递归 ,可以加快执行速度 3.无逆序,分段的时候递增的为一段,段数不确定 ...4.与插入相结合,因为数列个数在16以内的话插入排序会比归并排序要快
是本人亲手写的,经过测试确实可运行的正确代码,因个人所作,不过算法可能有可改进之处,供广大网友参考与探讨,以求抛砖引玉吧
包括所有算法实验(快速排序,归并排序,回溯算法,N后问题等。)
主要介绍了C语言演示对归并排序算法的优化实现,归并排序的最差时间复杂度为(nlog n),最优时间复杂为(n),存在可以改进的空间,需要的朋友可以参考下
排序算法基础、改进综合: //冒泡排序 //定向冒泡[鸡尾酒]排序 //选择排序 //改进的选择排序 ...//自顶向下地归并排序 //自底向上地归并排序 //堆排序 //快速排序 //改进的快速排序:三向切分快速排序
这是我用c++语言编写的一个模板类,主要封装了各种排序方法(直接插入、二分插入、简单交换、冒泡、简单选择、快速排序、归并排序、堆排序),并能统计所用时间以及排序所用的交换次数、比较次数,在Visual stidio ...
提出了一种改进的归并排序算法。采用非递归方法,对记录集从头至尾顺序地进行扫描,并将相邻的两个有序序列合并成一个整体。该算法较2_路归并排序算法更简单,更易理解,同时也取消了栈空间。
归并排序改进 归并排序自底向上 快速排序 随机化快速排序 双路快速排序 三路快速排序 堆和堆排序 堆的基本存储 ShiftUp ShiftDown 基础堆排序和Heapify 优化的堆排序 索引堆(IndexHeap) 索引堆的优化 二分搜索树 二...
文章目录希尔排序归并排序快速排序(20世纪对世界影响最大的算法之一)牛掰!堆排序 希尔排序 排序思想:希尔排序可以说是插入排序的一种变种。无论是插入排序还是冒泡排序,如果数组的最大值刚好是在第一位,要将它...
用java实现了以下算法: 1、冒泡排序、冒泡排序的两种改进。 2、插入排序。 3、选择排序。 4、希尔排序。 5、归并排序。 6、快速排序。
C语言中常见的排序算法包括归并排序、选择排序、直接插入排序、希尔排序、冒泡排序、快速排序、堆排序以及顺序查找和二分查找。这些排序算法各有特点,在不同情况下有着不同的应用场景和性能表现。 归并排序(Merge...
各种排序算法java实现:插入排序、冒泡排序、选择排序、Shell排序、快速排序、改进后的快速排序、归并排序、改进后的归并排序、堆排序!
各类排序算法java的实现,as 插入排序:冒泡排序:选择排序:Shell排序:快速排序:改进后的快速排序:归并排序:改进后的归并排序: 堆排序:SortUtil
插入排序冒泡排序:选择排序: Shell排序:快速排序:改进后的快速排序:归并排序: 改进后的归并排序:堆排序: 的源代码,对数组进行排序,直接可以运行.
文中详细介绍并分析了归并排序算法的优缺点,针对归并算法的强制把数据划分两份进行了改进,提出按照数据本身具有的规律进行智能归并排序划分的方法。该方法将局部有序的记录块作为一组,避免对已经有序的数据划分再...
在计算机处理信息的过程中, 排序算法是一种重要运算. 二路归并排序所需要使用的辅助空间与待排序数据规模相同, 空间占有量过大, 有改进的必要. 利用手摇法, 我们可以实现原地二路归并, 且时间效率也比较理想.