快速排序和归并排序都是采用了分治法的策略
分治法是将大的问题逐渐分解成单位元素的问题,然后再从底层一个个子问题的合成为原来问题的解。能采用分治法的案例,子问题一定是互相独立的,即不存在重叠子问题。
1.快速排序
目标:输入一个数组a[p:r],并通过基准元素a[t](p<t<r)在a[p:t-1]中找到比a[t]小的元素和在a[t+1:r]中找到比a[t]大的元素,并按照顺序排列大小,即a[p:t-1]中的小者,a[t],a[t+1:r]中的大者。一般我们选用基准元素a[p],经过不停的查找就可以使得排序完成。
算法的时间特性和每次划分的对称性有关,如果每次都是划分在第一个位置,则算法复杂
T(n)=O(1),n=1;
T(n)=T(n-1)+O(n),n>1;
最好情况下,每次划分都很均匀
T(n)=O(1),n=1;
T(n)=2T(n/2)+O(n),n>1;
/* 快速排序程序模块 分治算法的案例 以中心点a[p]找出在p,到r中间的比a[p]小的和比a[p]大的并交换成所需的顺序 */ void swap(int a[],int i,int j) { int temp; temp=a[i]; a[i]=a[j]; a[j]=temp; } int partition(int a[],int p,int r) { int i=p; int j=r+1; int x=a[p]; while(1) { while(a[++i]<=x); while(a[--j]>=x); if(i>=j){ break; } swap(a,i,j); } a[p]=a[j]; a[j]=x; return j; } void quickSort(int a[],int p,int r) { if(p<r) { int q=partition(a,p,r); quickSort(a,p,q-1); quickSort(a,q+1,r); } }
改进方法:基准元素由随机数生成下标
2.归并排序
目标:将数组a[p:r]逐步对半分解,直到只剩下一个元素的时候它就是有序的数组,进而和另一个分解出来长度为1的数组进行合并,合并的时候排序,生成长度为2的有序数组,不断递归最后生成原问题的解:有序数组。
根据图解很容易就能明白。程序实现的过程中需要借助一个暂存数组b,在对a数组操作时候转到b数组的操作可以保证信息的不丢失,最后将排好的数组b复制到a的对应位置上,即可完成。
/* 归并排序程序模块 分成长度为1的数组,进而与另一个单元数组合并成2长度的数组并排序 */ void merge(int a[],int b[],int low,int mid,int high) { int s=low,t=mid+1,k=low; while(s<=mid && t<=high){ if(a[s]<a[t]){ b[k]=a[s]; s++; }else{ b[k]=a[t]; t++; } k++; } if(s==mid+1){ for(int i=k;i<=high;i++)b[i]=a[t++]; }else{ for(int i=k;i<=high;i++)b[i]=a[s++]; } for(int i=low;i<=high;i++)a[i]=b[i];//复制回原数组 } void mergeSort(int a[],int b[],int low,int high) { if(low<high){ int mid=(low+high)/2; mergeSort(a,b,low,mid); mergeSort(a,b,mid+1,high); merge(a,b,low,mid,high); } }
快速排序和归并排序是入门的时候比较难看懂的分治算法,比较起二分法的案例程序的结构更加抽象难懂,主要是递归之后结构变得复杂了。
相关推荐
本实验旨在通过对两种经典排序算法——快速排序和归并排序的研究与实现,深入理解它们的基本原理、时间复杂度,并通过编程实践比较这两种算法在不同数据规模下的性能表现。 #### 二、快速排序 **1. 基本思想** ...
选择排序、插入排序、冒泡排序以及快速排序和归并排序的C语言实现,绝对可用
快速排序和归并排序是两种常用的排序算法,它们在计算机科学和编程领域有着广泛的应用,尤其是在数据处理和分析中。MATLAB作为一种强大的数值计算和数据分析工具,提供了丰富的函数和工具来实现这些算法。 快速排序...
快速排序、归并排序、基数排序等排序算法比较,比较时间性能,采用C++语言实现。。。
实验结果显示,快速排序和归并排序的运行时间存在波动,但总体上快速排序的平均运行时间更短,表明在平均情况下快速排序的效率更高。这是因为快速排序的平均时间复杂度为O(n log n),而归并排序无论在最好、最坏还是...
快速排序和归并排序是两种常用的排序算法,它们在计算机科学和互联网领域有着广泛的应用。本次实验的主要目的是对比这两种算法在平均情况下的运行效率,并通过实际编程和实验数据来加深对时间复杂度的理解。 快速...
快速排序通过一次划分将数组分成两部分,归并排序则是先递归分割再合并。在实际应用中,快速排序通常具有较高的平均性能,但归并排序由于其稳定性和在某些情况下的更优性能,也有其独特的优势。 通过上述代码示例,...
快速排序和归并排序是两种高效且广泛应用的排序算法,它们在时间和空间复杂度上有各自的特点。 快速排序是由英国计算机科学家C.A.R. Hoare在1960年提出的,其核心思想是“分治”策略。算法首先选择一个基准元素,...
**快速排序与归并排序算法比较实验报告** 在计算机科学中,排序算法是处理大量数据时不可或缺的一部分。这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试...
以下是关于"插入排序、选择排序、希尔排序、堆排序、冒泡、双向冒泡、快速排序、归并排序、递归的归并排序、基数排序"这十大经典排序算法的详细解释: 1. 插入排序:插入排序是一种简单的排序算法,它通过构建有序...
例如,冒泡排序和选择排序适合小规模数据,而快速排序和归并排序则适用于大规模数据。在实际应用中,应根据具体需求和数据特性选择合适的排序算法。学习和理解这些排序算法的原理及源码实现,对于提升编程能力具有...
本文将深入探讨三种常见的高效排序算法:堆排序、快速排序和归并排序。它们都是基于不同的原理和策略,具有各自的优势和适用场景。 首先,堆排序是一种基于比较的排序算法,利用了二叉堆的数据结构。二叉堆是一个...
例如,对于大数据集,快速排序和归并排序通常更高效;而对于小数据集,简单的排序算法如插入排序或选择排序就足够了。在Java中,这些排序算法可以通过Collections.sort()方法或者自定义Comparator来实现,方便快捷。...
快速排序和归并排序是两种常用的排序算法,它们在计算机科学中扮演着重要的角色,尤其在数据处理和算法效率分析方面。快速排序是由C.A.R. Hoare在1962年提出的,而归并排序则是一种基于分治策略的排序算法。 快速...
本篇将详细探讨快速排序、希尔排序和归并排序这三种在C语言中常见的排序算法。 首先,我们来看快速排序(Quick Sort)。快速排序由C.A.R. Hoare在1960年提出,其基本思想是分治法。它的核心是选择一个基准元素,...
本文将详细探讨两种常见的高效排序算法——快速排序和归并排序,它们都是C语言实现的重点。 首先,快速排序是一种由C.A.R. Hoare在1960年提出的分治算法。其基本思想是选取一个基准元素,然后将数组分为两部分,一...
快速排序、归并排序和堆排序都是经典且高效的排序算法,它们各自具有独特的实现方式和性能特点。这篇文章将详细探讨这三个排序算法,并对比它们的时间复杂度。 首先,我们来看快速排序。快速排序由C.A.R. Hoare在...
其基本思想是选取一个“基准”元素,将数组分为两部分,一部分的元素都小于基准,另一部分的元素都大于或等于基准,然后对这两部分分别进行快速排序,最后合并结果。快速排序的平均时间复杂度为O(n log n),但在最坏...