排序算法——归并排序(Merge Sort)

归并排序

归并的英文是:Merge sort
其实我们上一节shell排序的论文里面讲到的就是merge sort
merge sort的过程是,将数组分为许多的组,即将粗粒度的数组分为细粒度的数组,然后再将其合并
它的优点是,同时对多个数据进行对比排序

归并排序是分治法的典型应用
分:体现在将数组分为小数组
治:对排好序的数组进行合并

现在举例对其过程进行分析:

source:6, 202, 100, 301,38, 8, 1
->divide
6, 202, 100, 301
38, 8, 1
->divide
6, 202
100, 301
38, 8
1
->sort
6, 202
100, 301
8, 38
1
->merge
6, 100, 202, 301
1, 8, 38
->merge
1. 6, 8, 38, 100, 202, 301

速度仅仅次于快速排序,为稳定排序算法,一般用于对总体无序、对各个子项有序的数列

递归方法:

void mergeSort(int *array, int start, int end)
{
   
	if (start < end)
	{
   
		int mid = start + (end - start) / 2;  // 防止溢出int范围
		
		mergeSort(array, start, mid);   // 分成左右两部分
		mergeSort(array, mid + 1, end);
		
		// 接下来,array已经被分为了有序的两部分。对两个有序的部分进行合并
		int tmp[end - start + 1];  // 容器
		int i = start, j = mid + 1, k = 0;
		while (i <= mid && j <= end)
		{
   
			tmp[k ++] = (array[i] < array[j]) ? array[i ++] : array[j ++];
		}
		while (i <= mid)
			tmp[k ++] = array[i ++];
		while (j <= end)
			tmp[k ++] = array[j ++];
		
		// 复制给原数组
		k = 0;
		i = start;
		while (i <= end)
			array[i ++] = tmp[k ++];
	}
}

使用了额外的空间tmp,大小为n,来对数组进行存储

至于非递归方法,看起来很花里胡哨,我觉得实际上实现它没有多大的意义

C语言的递归深度,在64位机上,经过多次实验,大概在261700附近

深度为k的递归层数足以对规模为 2 k 2^k 2k的数据进行排序。也就是说,使用递归法能至多对 2 261700 2^{261700} 2261700即大概

354703328510148184909794813689985817478112831929519018363350520859757302378244163483551508569502562823644973480976247210083836400352830319986660875377611852015276051411008687147956332013963597950390327327178368644364272626582378565244625956296792851992628299329826823685714811760149106352436353777188161582667545148079270576181591115970747113760366658269857490959184083017195947510845765423078383933493077874351657355550024698148773451423031111603177714297335681630329653101624640932174187393782577791170084105065860483696390230026724175742627356770967697330441568657400169126412085738796861077786490715687343974567756161842305495311226838904325683122081408304426891503887163410357272986076428257040613388142163457170139013680834078380474664916922873059718893673529555429164658909449505494409540451492415977521233778249775412914512611004282626235754591930421533101844773355296179959622043577153903559064977833734701280304420735729086048035961781878874973150752202418465336364465317290010693740375550489300327771478423264578675990794239131042415373715841349283848853541835829903360558313605607334058543606707788649950008847627639379158320532667529469453181124728133109433251637851611436081875954866981165547817215380543023040309431233349212937718637950408434203097369191172990029027944925161334520381294229077437010017564977022560955519395357825908102274947186082698260841594703330791604261882119339647515521097179248745458520133951940156289586921900714445284935952787869842870032989495550844497034195163812125037035364165597012492765359523297702617267232668804547042210029401743659826157826974090233461618166680454591537814478393405619585612540762752584817323459328017413645941402563323566577528142917613482794884791389520599869240862762628870201066537869904971028089703001789000694343238015885123344649008360849683039343646483634905887161874443561538903197312913784849304277109190580762017405202696394113869736624463823863793675280429034005649838804421900293637807369999325901473435809746300440749897712189048617364932572019072439493684258179682471732907582303738964938454780735952312526513568681367724520254244176957158200984651941349319697348156153082311724378800984678150371036038988729910625421689371841198999938954461906879623391465071184589418359931718474690284832670578363374686918175803038721937538523709681346636465635189486911683256990224861993229538134308332861447322105946046603330068220056102031738506865985918500686609841501576289659124721581877386262932726545860313056020332478664995071316399566197729124431046674221395237902121730848630960923528662424852853749742785132783066246397173361141473636257331656140451341410689029674067381224991721219313545205294926682580264279296317156061201668552737958825913569720953003800250878625339903201464047159018461002610191767401702168878304305060052796337860793568003463138994155739945287924251300480159148623432881430219299272997482290701674285936360412350536038422244780575030785605609687626954707741410093162353569610265680304841492455098222014622792338108771771296321383808217787623919663559245915314682422364073370014203347783771076337466138204411539296564006220853805269420645072930966724537364199244092133873213299794011745962567089228402844040748622107282510359508824966304846469215763848502949306787375699490142885444253885518384720374899917515966458496276310651401436466346306240455363665760045556755882861164749169615412814206788527244452684053598768593116022545196729017970545513994888112265743602982461464243186371472657713036071073021082804989993073372802123951387378511957976866800046245275786713706123276957052191381671481284795265199956449095519234014978325825228085697435679808623015137790818064379218622104454910859668929013710316889132594192109762280585375725639129178758724934992318785989389852845565300445171238024382819384796096312905227705820696464093710393603428192040647569110472699133294507442939529964827313267255174079609923373979693249936301109217033819893942701260324929652671679682397143745612527979189516334238765232091167055680667220076766081343925975747150818030403254664957170591500725089641850685675050572983106186761633186329379032168216973039698671183563710197563074175655307927734764892262553496437737646210883811405328847708431327098357747773188263615129824264397271650542377660959422693448613588132135891381913108916460841021959125365983561518186905756093330736717991917794267707325354075922354630918076758112206249249334321106624008842360774821608301967247068294802972091088722488911468168177057759800385862501339149755402772877322291218223675009678637904471612597171566954739680854347643120953408234927924002515459887666442853351439225016707174838155319185050704406155512848092188549566523790666468984044406740683672849578741095801582127505745915630547606898545300140900669989808389739299331387059101303708512901001434776317083743183531501870489437371868135816887199489636260513975737563804490254582445155465812945746885037162889337166609043665466151189814048250497211620230119909769466649046848069387826373314668508802560677819241454621599302092193206900097178270472004288279253383479396540058487050818733419459240007135963392978906699971096255901709720969597011114289050124374008527272915880089427216171033955725498016836190379615492521297233592405941750153411956020906407482733441778166468528061136665182593481579596204064726508635360094954133995254805699020132252978417450891002132076456097838464760000532641380911957374613542045900993845320224878741557864846473717073871866123710095695115116729800486788390078887519094082788802991252511671605754119288045966519916661344381686178378247099260715247482803235814522636749085439114108117065797802436272583715298313363922038984453231254826479994032349021067655156798163329186377494564776733011130299351721921427676539999558897031280990337156288016973628570151743926467071064000376392656977904181184717622755005283538296811413754373330692022747099912531868124254298751893981833480322831420608730438328167866669530584341341192318538646880701447986885550769430068398521252973082844235110758856097682627134027808078152499328353135712227240841208861499773411982507292119151193573549105647644699439277435734716992197825809906159467478651644655908839716345912072381344028193571151870408385887035277830867424262418885756156200606091946677347789905703791826025858513110082980941852696865660052510915434243396051226723943676431433906684696240081025341727918111412080068248495398484141287155067799997543188630250041713398797685399121839373915259204559589143781984917741147807606870605886848898505283349869166496677749006804617831849983403035411339231365984648238624806436806086433958151902474157826311843080315973850942535801086270148540719149677348743745987857209727767127580696337671072604411924631213087952719176675949979526408207833056674112977601735624482482
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值