真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

php數(shù)據(jù)歸并排序,歸并排序 php

常見(jiàn)算法4、合并(歸并)排序 Merge sort

歸并排序,是創(chuàng)建在歸并操作上的一種有效的排序算法。算法是采用分治法(Divide and Conquer)的一個(gè)非常典型的應(yīng)用。

成都創(chuàng)新互聯(lián)是一家企業(yè)級(jí)云計(jì)算解決方案提供商,超15年IDC數(shù)據(jù)中心運(yùn)營(yíng)經(jīng)驗(yàn)。主營(yíng)GPU顯卡服務(wù)器,站群服務(wù)器,多線BGP機(jī)房,海外高防服務(wù)器,服務(wù)器機(jī)柜,動(dòng)態(tài)撥號(hào)VPS,海外云手機(jī),海外云服務(wù)器,海外服務(wù)器租用托管等。

假如如我這里有一組數(shù)據(jù),歸并排序過(guò)程如下:

通俗點(diǎn)來(lái)說(shuō),就是先分割,再合并。分割的過(guò)程中其實(shí)可理解為就是以二分法將數(shù)組分割成最小單元,然后再按順序合并起來(lái)。

1、Python 3 :

2、PHP:

常見(jiàn)的php排序算法

常見(jiàn)的php排序算法

本文匯總了常見(jiàn)的php排序算法,在進(jìn)行算法設(shè)計(jì)的時(shí)候有不錯(cuò)的借鑒價(jià)值?,F(xiàn)分享給大家供參考之用。具體如下:

一、插入排序

用文字簡(jiǎn)單的描述,比如說(shuō)$arr = array(4,2,4,6,3,6,1,7,9); 這樣的一組數(shù)字進(jìn)行順序排序:

那么,首先,拿數(shù)組的第二個(gè)元素和第一元素比較,假如第一個(gè)元素大于第二元素,那么就讓兩者位置互換,接下來(lái),拿數(shù)組的第三個(gè)元素,分別和第二個(gè),第一個(gè)元素比較,假如第三個(gè)元素小,那么就互換。依次類推。這就是插入排序,它的時(shí)間頻度是:1+2+...+(n-1)=(n^2)/2。則它的時(shí)間復(fù)雜度為O(n^2).

php實(shí)現(xiàn)代碼如下:

?phpfunction Sort($arr){ $count = count($arr); if($count2){ return $arr; } for($i=1;$i$count;$i++){ tmp="$arr[$i];" j=""=0$arr[$j]$arr[$i]){ return=""

二、選擇排序

選擇排序用語(yǔ)言描述的話,可以這樣,如:$arr = array(4,3,5,2,1);

首先,拿第一個(gè)和后面所有的比,找出最小的那個(gè)數(shù)字,然后和第一個(gè)數(shù)組互換(當(dāng)然,如果是第一個(gè)最小,那么就不用互換了),接著循環(huán),即:拿第二個(gè)和后面的比較,找出最小的數(shù)字,然后和第二個(gè)數(shù)字互換,依次類推,也就是說(shuō)每次都是找出剩余最小的值。 可得到:第一次,時(shí)間頻度 是n, (第一個(gè)和后面的n-1個(gè)比較,找到最小的,再看是不是第一個(gè),不是第一個(gè)的話進(jìn)行互換) 在往后,依次是 減一 。 它的時(shí)間復(fù)雜度,也是O(n^2);

php實(shí)現(xiàn)代碼如下:

?phpfunction selectSort($arr){ $count = count($arr); if($count2){ return $arr; } for($i=0;$i$count;$i++){ $min=$i; for(j=$i+1;$j$count;$j++){$arr[$j]){ $min = $j; //找到最小的那個(gè)元素的下標(biāo) } } if($min!=$i){//如果下標(biāo)不是$i 則互換。 $tmp= $arr[$i]; $arr[$i] = $arr[$min]; $arr[$min] = $tmp; } } return $arr; }?

三、冒泡排序

冒泡排序其實(shí)上是和選擇排序相比,并無(wú)明顯差別。都是找到最小的,放到最左端。依次循環(huán)解決問(wèn)題。差別在于冒泡排序的交換位置的次數(shù)較多,而選擇排序則是找到最小的元素的下標(biāo),然后直接和最左端的交換位置。

php實(shí)現(xiàn)代碼如下:

?phpfunction selectSort($arr){ $count = count($arr); if($count2){ return $arr; } for($i=0;$i$count;$i++){ for(j=$i+1;$j$count;$j++){$arr[$j]){ $tmp= $arr[$i]; $arr[$i] = $arr[$i]; $arr[$i] = $tmp; } } } return $arr; }?

四、快速排序

快速排序,用語(yǔ)言來(lái)形容的話,從數(shù)組中選擇一個(gè)值$a,然后和其余元素進(jìn)行比較,比$a大的放到數(shù)組right中,反之,放到數(shù)組left中。然后將left right 分別進(jìn)行遞歸調(diào)用,即:再細(xì)分left right ,最后進(jìn)行數(shù)組的合并。

php實(shí)現(xiàn)快速排序:

?phpfunction mySort($arr){ $count = count($arr); if($count2){ return $arr; } $key = $arr[0];//選擇第一個(gè)元素作為比較元素,可選其他 $left = array(); $right = array(); for($i=1;$i$count;$i++){ key=""=$arr[$i]){ $left[] = $arr[$i]; }else{ $right[] = $arr[$i]; } } $left = mySort($left); $right = mySort($right); $result = array_merge($left,$right); return $result; }?

五、歸并排序

其實(shí)歸并排序是一種拆分,合并的思想。和快速排序思想有共通之處,左邊一堆,右邊一堆,然后進(jìn)行合并。通過(guò)遞歸實(shí)現(xiàn)排序。 區(qū)別之處呢? 他們的區(qū)別也是思想上本質(zhì)的區(qū)別,快速排序的拆分,是選擇了特定的值進(jìn)行大小比較,從而分為left 和 right 。也就是小的一堆放入left,大的一堆放入right。而后,小的left 再細(xì)分為left1 right1。。。。通過(guò)進(jìn)行類似的遞歸完成排序。也就是說(shuō),一直細(xì)分下去,遞歸最末尾的left1就是最小值。

而歸并排序,是從幾何上的左右切分,一直遞歸切分成2或者1的'最小粒度的數(shù)組,然后才開(kāi)始進(jìn)行比較大小,然后合并。此處的比較大小是:兒子left的元素 和兒子的right元素 進(jìn)行比較,而后進(jìn)行排序合并成為父親left或者right。在此,直到拿到各自排序合并完成最后兩個(gè)數(shù)組:最起初的left 和right,也僅僅直到他們各自的順序,并不能確認(rèn)整個(gè)數(shù)組的順序,還是需要通過(guò)最終的left right 比較后合并才能完成真正意義上的排序。

?phpfunction gbSort($arr){ if(count($arr)=1){return min="floor(count($arr)/2);//取中間數(shù)字進(jìn)行拆分" left="gbSort($left);" right="gbSort($right);" return="" function=""$right[0] ? array_shift($right) : array_shift($left); //進(jìn)行比較,小的移除,并且放入到數(shù)組$m中。 } return arr_merge($m,$left,$right);//進(jìn)行合并(由于不知道left right 哪個(gè)會(huì)為空,所以進(jìn)行統(tǒng)一合并)}?

六、堆排序

本例中fixDown函數(shù)實(shí)現(xiàn)對(duì)某一個(gè)節(jié)點(diǎn)的向下調(diào)整,這里默認(rèn)的是起始節(jié)點(diǎn)為1,方便計(jì)算父子節(jié)點(diǎn)關(guān)系

注:

起始節(jié)點(diǎn)為1的父子關(guān)系: 父節(jié)點(diǎn)k, 子節(jié)點(diǎn)為2K、2k+1 子節(jié)點(diǎn)j, 父節(jié)點(diǎn)為 floor(j/2) floor為向下取整

起始節(jié)點(diǎn)為0的父子關(guān)系: 父節(jié)點(diǎn)k, 子節(jié)點(diǎn)為2K+1, 2k+2 子節(jié)點(diǎn)j, 父節(jié)點(diǎn)為 floor((j-1)/2)

參數(shù)$k為調(diào)整點(diǎn)位置, $lenth為數(shù)組長(zhǎng)度,也就是從1起始到最后一個(gè)節(jié)點(diǎn)的坐標(biāo).

?phpfunction fixDown($arr, $k, $lenth){while(2*$k=$lenth) { //只要當(dāng)前節(jié)點(diǎn)有子節(jié)點(diǎn), 就需要繼續(xù)該循環(huán) $j = $k*2; if ($j$lenth $arr[$j]$arr[$j+1]) $j++; // 只要子節(jié)點(diǎn)有右節(jié)點(diǎn),且右節(jié)點(diǎn)比左節(jié)點(diǎn)大,那么切換到右節(jié)點(diǎn)操作。 if ($arr[$j] $arr[$k]) break; // 如果子節(jié)點(diǎn)都沒(méi)有父節(jié)點(diǎn)大, 那么調(diào)整結(jié)束。 exch($arr[$j], $arr[$k]); $k = $j; }}function exch($a, $b) { $tmp = $a; $a = $b; $b = $tmp;}function headSort($arr){ $len = count($arr); array_unshift($arr, NULL); for($i=$len/2;$i=1;$i--) { fixDown($arr, $i, $len); } while($len1) { exch($arr[1], $arr[$len]); fixDown($arr, 1, --$len); } array_shift($arr);}$arr = array(4,6,4,9,2,3);headSort($arr);?

希望本文所述排序算法實(shí)例對(duì)大家的php程序設(shè)計(jì)有所幫助。

;

php如何去循環(huán)出數(shù)據(jù)并排序顯示

方法一,可以在查詢的時(shí)候就按SORT排序。

方法二、用php數(shù)組排序函數(shù)對(duì)數(shù)據(jù)進(jìn)行重新排序

希望可以幫到你

php 歸并排序,,對(duì)于兩次遞歸調(diào)用自身有點(diǎn)不理解,求大神指教,不太明白執(zhí)行過(guò)程

可以考慮把變量名修改一下

$l = $start

$m = $mid

$r = $end

這樣的話兩次調(diào)用其實(shí)也就是把整個(gè)數(shù)組先拆分成兩部分,然后這兩部分各自做排序,之后再合并

遞歸處理,如果對(duì)代碼邏輯不能直接理解的話,可以考慮從實(shí)際數(shù)據(jù)著手來(lái)理解

比如假設(shè)數(shù)組中只有一個(gè)數(shù),程序會(huì)怎樣執(zhí)行,假設(shè)數(shù)組中只有兩個(gè)數(shù),程序會(huì)怎樣執(zhí)行。。。

歸并排序的示例代碼

歸并排序原理

歸并排序具體工作原理如下(假設(shè)序列共有n個(gè)元素):

將序列每相鄰兩個(gè)數(shù)字進(jìn)行歸并操作(merge),形成floor(n/2)個(gè)序列,排序后每個(gè)序列包含兩個(gè)元素

將上述序列再次歸并,形成floor(n/4)個(gè)序列,每個(gè)序列包含四個(gè)元素

重復(fù)步驟2,直到所有元素排序完畢

示例代碼

Go語(yǔ)言 func?mergeSort(r?[]int)?[]int?{????length?:=?len(r)???????if?length?=?1?{????????return?r?????}???????num?:=?length?/?2????left?:=?mergeSort(r[:num])???????right?:=?mergeSort(r[num:])???????return?merge(left,?right)}func?merge(left,?right?[]int)?(result?[]int)?{???????l,?r?:=?0,?0???????for?l??len(left)??r??len(right)?{????????if?left[l]??right[r]?{?????????????????????result?=?append(result,?left[l])?????????????????????l++??????????????}?else?{?????????????????????result?=?append(result,?right[r])?????????????????????r++??????????????}???????}???????result?=?append(result,?left[l:]...)???????result?=?append(result,?right[r:]...)???????return}Java語(yǔ)言 package algorithm;public class MergeSort {????// private static long sum = 0;????/**???? * pre???? * 二路歸并???? * 原理:將兩個(gè)有序表合并和一個(gè)有序表???? * /pre???? * ???? * @param a???? * @param s???? * 第一個(gè)有序表的起始下標(biāo)???? * @param m???? * 第二個(gè)有序表的起始下標(biāo)???? * @param t???? * 第二個(gè)有序表的結(jié)束小標(biāo)???? * ???? */????private static void merge(int[] a, int s, int m, int t) {????????int[] tmp = new int[t - s + 1];????????int i = s, j = m, k = 0;????????while (i  m  j = t) {????????????if (a[i] = a[j]) {????????????????tmp[k] = a[i];????????????????k++;????????????????i++;????????????} else {????????????????tmp[k] = a[j];????????????????j++;????????????????k++;????????????}????????}????????while (i  m) {????????????tmp[k] = a[i];????????????i++;????????????k++;????????}????????while (j = t) {????????????tmp[k] = a[j];????????????j++;????????????k++;????????}????????System.arraycopy(tmp, 0, a, s, tmp.length);????}????/**???? * ???? * @param a???? * @param s???? * @param len???? * 每次歸并的有序集合的長(zhǎng)度???? */????public static void mergeSort(int[] a, int s, int len) {????????int size = a.length;????????int mid = size / (len  1);????????int c = size  ((len  1) - 1);????????// -------歸并到只剩一個(gè)有序集合的時(shí)候結(jié)束算法-------//????????if (mid == 0)????????????return;????????// ------進(jìn)行一趟歸并排序-------//????????for (int i = 0; i  mid; ++i) {????????????s = i * 2 * len;????????????merge(a, s, s + len, (len  1) + s - 1);????????}????????// -------將剩下的數(shù)和倒數(shù)一個(gè)有序集合歸并-------//????????if (c != 0)????????????merge(a, size - c - 2 * len, size - c, size - 1);????????// -------遞歸執(zhí)行下一趟歸并排序------//????????mergeSort(a, 0, 2 * len);????}????public static void main(String[] args) {????????int[] a = new int[] { 4, 3, 6, 1, 2, 5 };????????mergeSort(a, 0, 1);????????for (int i = 0; i  a.length; ++i) {????????????System.out.print(a[i] +);????????}????}}Python語(yǔ)言 def?MergeSort(lists):????if?len(lists)?=?1:????????return?lists????num?=?int(?len(lists)/2?)????left?=?MergeSort(lists[:num])????right?=?MergeSort(lists[num:])????return?Merge(left,?right)def?Merge(left,right):????r,?l=0,?0????result=[]????while?llen(left)?and?rlen(right):????????if?left[l]??right[r]:????????????result.append(left[l])????????????l?+=?1????????else:????????????result.append(right[r])????????????r?+=?1????result?+=?right[r:]????result+=?left[l:]????return?resultprint?MergeSort([1,?2,?3,?4,?5,?6,?7,?90,?21,?23,?45])C語(yǔ)言 #include?stdlib.h#include?stdio.hvoid?Merge(int?sourceArr[],int?tempArr[],?int?startIndex,?int?midIndex,?int?endIndex){????int?i?=?startIndex,?j=midIndex+1,?k?=?startIndex;????while(i!=midIndex+1??j!=endIndex+1)????{????????if(sourceArr[i]?=?sourceArr[j])????????????tempArr[k++]?=?sourceArr[j++];????????else????????????tempArr[k++]?=?sourceArr[i++];????}????while(i?!=?midIndex+1)????????tempArr[k++]?=?sourceArr[i++];????while(j?!=?endIndex+1)????????tempArr[k++]?=?sourceArr[j++];????for(i=startIndex;?i=endIndex;?i++)????????sourceArr[i]?=?tempArr[i];}//內(nèi)部使用遞歸void?MergeSort(int?sourceArr[],?int?tempArr[],?int?startIndex,?int?endIndex){????int?midIndex;????if(startIndex??endIndex)????{????????midIndex?=?(startIndex?+?endIndex)?/?2;????????MergeSort(sourceArr,?tempArr,?startIndex,?midIndex);????????MergeSort(sourceArr,?tempArr,?midIndex+1,?endIndex);????????Merge(sourceArr,?tempArr,?startIndex,?midIndex,?endIndex);????}}int?main(int?argc,?char?*?argv[]){????int?a[8]?=?{50,?10,?20,?30,?70,?40,?80,?60};????int?i,?b[8];????MergeSort(a,?b,?0,?7);????for(i=0;?i8;?i++)????????printf(%d?,?a[i]);????printf(\n);????return?0;}PHP語(yǔ)言 //merge函數(shù)將指定的兩個(gè)有序數(shù)組(arr1arr2,)合并并且排序//我們可以找到第三個(gè)數(shù)組,然后依次從兩個(gè)數(shù)組的開(kāi)始取數(shù)據(jù)哪個(gè)數(shù)據(jù)小就先取哪個(gè)的,然后刪除掉剛剛?cè)∵^(guò)///的數(shù)據(jù)functional_merge($arrA,$arrB){????$arrC?=?array();????while(count($arrA)??count($arrB)){????????//這里不斷的判斷哪個(gè)值小,就將小的值給到arrC,但是到最后肯定要剩下幾個(gè)值,????????//不是剩下arrA里面的就是剩下arrB里面的而且這幾個(gè)有序的值,肯定比arrC里面所有的值都大所以使用????????$arrC[]?=?$arrA['0']??$arrB['0']???array_shift($arrA)?:?array_shift($arrB);????}????returnarray_merge($arrC,?$arrA,?$arrB);}//歸并排序主程序functional_merge_sort($arr){????$len=count($arr);????if($len?=?1)????????return?$arr;//遞歸結(jié)束條件,到達(dá)這步的時(shí)候,數(shù)組就只剩下一個(gè)元素了,也就是分離了數(shù)組????$mid?=?intval($len/2);//取數(shù)組中間????$left_arr?=?array_slice($arr,?0,?$mid);//拆分?jǐn)?shù)組0-mid這部分給左邊left_arr????$right_arr?=?array_slice($arr,?$mid);//拆分?jǐn)?shù)組mid-末尾這部分給右邊right_arr????$left_arr?=?al_merge_sort($left_arr);//左邊拆分完后開(kāi)始遞歸合并往上走????$right_arr?=?al_merge_sort($right_arr);//右邊拆分完畢開(kāi)始遞歸往上走????$arr=al_merge($left_arr,?$right_arr);//合并兩個(gè)數(shù)組,繼續(xù)遞歸????return?$arr;}$arr?=?array(12,?5,?4,?7,?8,?3,?4,?2,?6,?4,?9);print_r(al_merge_sort($arr));Pascal語(yǔ)言 program mergesort_1;const maxn=7;type arr=array[1..maxn] of integer;var a,b,c:arr;i:integer;procedure merge(r:arr;l,m,n:integer;varr2:arr);var i,j,k,p:integer;begin i:=l; j:=m+1; k:=l-1; while (i=m) and (j=n) do begin k:=k+1; if r[i]=r[j] then begin r2[k]:=r[i]; i:=i+1 end else begin r2[k]:=r[j]; j:=j+1; end end; if i=m then for p:=i to m do begin k:=k+1; r2[k]:=r[p]; end; if j=n then for p:=j to n do begin k:=k+1; r2[k]:=r[p]; end;end;procedure mergesort(var r,r1:arr;s,t:integer);var k:integer;c:arr;begin if s=t then r1[s]:=r[s] else begin k:=(s+t)div2; mergesort(r,c,s,k); mergesort(r,c,k+1,t); merge(c,s,k,t,r1) end;end;begin write('Enterdata:'); for i:=1 to maxn do read(a[i]); mergesort(a,b,1,maxn); for i:=1 to maxn do write(b[i]:9); writeln;end.//============================================program mergesort_2;const max=100000;var a,r:array[1..max] of long int;n,i:long int;procedure msort(s,t:longint);var m,i,j,k:long int;begin if s=t then exit; m:=(s+t)div2; msort(s,m); msort(m+1,t); i:=s; j:=m+1; k:=s; while (i=m) and (j=t) do begin if a[i]a[j] then begin r[k]:=a[i]; inc(i); inc(k); end else begin r[k]:=a[j]; inc(j); inc(k); end; end; while i=m do begin r[k]:=a[i]; inc(i); inc(k); end; while j=t do begin r[k]:=a[j]; inc(j); inc(k); end; for i:=s to t do a[i]:=r[i];end;begin readln(n); for i:=1 to n do read(a[i]); msort(1,n); for i:=1 to n do writeln(a[i]);end.Basic語(yǔ)言 Sub?MergeSort(Array()?As?Integer,?First?As?Integer,?Last?As?Integer)Dim?mid?As?Integer?=?0If?firstlast?Then?mid?=?(first+last)\?2MergeSort(Array,?first,?mid);MergeSort(Array,?mid+1,?last);Merge(Array,?first,?mid,?last);End?IfEnd?Sub/*以下示例代碼實(shí)現(xiàn)了歸并操作。array[]是元素序列,其中從索引p開(kāi)始到q位置,按照升序排列,同時(shí),從(q+1)到r也已經(jīng)按照升序排列,merge()函數(shù)將把這兩個(gè)已經(jīng)排序好的子序列合并成一個(gè)排序序列。結(jié)果放到array中。*//***?0?=?p?=?q??r,?subarray?array[p..q]?and?array[q+1..r]?are?already?sorted.*?the?merge()?function?merges?the?two?sub-arrays?into?one?sorted?array.*/void?Merge(int?array[],?int?p,?int?q,?int?r){????int?i,k;????int?begin1,end1,begin2,end2;????int*?temp?=?(int*)malloc((r-p+1)*sizeof(int));????begin1?=?p;????end1???=?q;????begin2?=?q+1;????end2???=?r;????k?=?0;????while((begin1?=?end1)(?begin2?=?end2))????{????????if(array[begin1]?=?array[begin2]){?????????????temp[k]?=?array[begin1];????????????begin1++;????????}????????else????????{????????????temp[k]?=?array[begin2];????????????begin2++;????????}????????k++;????}????while(begin1=end1?||?begin2=end2)????{????????if(begin1=end1)????????{????????????temp[k++]?=?array[begin1++];????????}????????if(begin2=end2)????????{????????????temp[k++]?=?array[begin2++];????????}????????}????????for?(i?=?0;?i??=(r?-?p);?i++)????????????array[p+i]?=?temp[i];????free(temp);}JavaScript語(yǔ)言

使用遞歸的代碼如下。優(yōu)點(diǎn)是描述算法過(guò)程思路清晰,缺點(diǎn)是使用遞歸,mergeSort()函數(shù)頻繁地自我調(diào)用。長(zhǎng)度為n的數(shù)組最終會(huì)調(diào)用mergeSort()函數(shù) 2n-1次,這意味著一個(gè)長(zhǎng)度超過(guò)1500的數(shù)組會(huì)在Firefox上發(fā)生棧溢出錯(cuò)誤??梢钥紤]使用迭代來(lái)實(shí)現(xiàn)同樣的功能。 function merge(left,?right){????var result=[];????while(left.length0??right.length0){????????if(left[0]right[0]){????????/*shift()方法用于把數(shù)組的第一個(gè)元素從其中刪除,并返回第一個(gè)元素的值。*/????????????result.push(left.shift());????????}else{????????????result.push(right.shift());????????}????}????return result.concat(left).concat(right);}function mergeSort(items){????if(items.length?==?1){????????return items;}var middle?=?Math.floor(items.length/2),????left?=?items.slice(0,?middle),????right?=?items.slice(middle);????return merge(mergeSort(left),?mergeSort(right));}非遞歸算法(C++) #includeiostream#includectime#includecstring#includecstdlibusing?namespace?std;/**將a開(kāi)頭的長(zhǎng)為length的數(shù)組和b開(kāi)頭長(zhǎng)為right的數(shù)組合并n為數(shù)組長(zhǎng)度,用于最后一組*/void Merge(int* data,int a,int b,int length,int n){ int right; if(b+length-1?=?n-1) right?=?n-b; else right?=?length; int* temp?=?new int[length+right]; int i=0,?j=0; while(i=length-1??j=right-1){???? if(data[a+i]?=?data[b+j]){???? ????temp[i+j]?=?data[a+i];i++;??????}???? else{????????temp[i+j]?=?data[b+j];????????j++;??????} } if(j?==?right){//a中還有元素,且全都比b中的大,a[i]還未使用 ??memcpy(temp?+?i?+?j,?data?+?a?+?i,?(length?-?i)?*?sizeof(int)); }??else?if(i?==?length){??????memcpy(temp?+?i?+?j,?data?+?b?+?j,?(right?-?j)*sizeof(int));??} memcpy(data+a,?temp,?(right?+?length)?*?sizeof(int)); delete?[]?temp;}void MergeSort(int* data,?int n){ int step?=?1; while(step??n){???? for(int i=0;?i=n-step-1;?i+=2*step)???? ????Merge(data,?i,?i+step,?step,?n);????//將i和i+step這兩個(gè)有序序列進(jìn)行合并????//序列長(zhǎng)度為step????//當(dāng)i以后的長(zhǎng)度小于或者等于step時(shí),退出???? step*=2;//在按某一步長(zhǎng)歸并序列之后,步長(zhǎng)加倍 }}int main(){ int n; cinn; int* data?=?new int[n]; if(!data) exit(1); int k?=?n; while(k--){ ????cindata[n-k-1]; } clock_t s?=?clock(); MergeSort(data,?n); clock_t e?=?clock(); k=n; while(k--){ ????coutdata[n-k-1]'?'; } coutendl; coutthe?algorithm?usede-smiliseconds.endl; delete data; return 0;}二路歸并

ConstFI='in.txt';FO='out.txt';MaxN=10000;TypeTIndex=Longint;TDat=Array[0..MaxN]OfTIndex;VarN:TIndex;Dat:TDat;Tmp:TDat;ProcedureMerge(L,Mid,R:TIndex);VarP1,P2:TIndex;E1,E2:TIndex;P:TIndex;I:TIndex;BeginP1:=L;P2:=Mid+1;P:=L;RepeatIf(Dat[P1]=Dat[P2])ThenBeginTmp[P]:=Dat[P1];Inc(P1);Inc(P);EndElseBeginTmp[P]:=Dat[P2];Inc(P2);Inc(P);End;Until(P1=Mid+1)Or(P2=R+1);If(P1=Mid+1)ThenBeginE1:=P2;E2:=R;EndElseBeginE1:=P1;E2:=Mid;End;ForI:=E1ToE2DoBeginTmp[P]:=Dat[I];Inc(P);End;End;ProcedureSort(L,R:TIndex);VarMid:TIndex=0;BeginMid:=(L+R)Shr1;If(LMid)ThenSort(L,Mid);If(Mid+1R)ThenSort(Mid+1,R);Merge(L,Mid,R);ForMid:=LToRDoDat[Mid]:=Tmp[Mid];End;ProcedureInit;VarI:TIndex;BeginFillChar(Dat,SizeOf(Dat),0);Readln(N);ForI:=1ToNDoRead(Dat[I]);End;ProcedureMain;BeginSort(1,N);End;ProcedureFinal;VarI:TIndex;BeginForI:=1ToNDoWrite(Dat[I],'');Writeln;End;BeginAssign(Input,FI);Assign(Output,FO);Reset(Input);Rewrite(Output);Init;Main;Final;Close(Input);Close(Output);End.

Delphi歸并排序完整源代碼例子: //合并子函數(shù)procedureTForm1.MergePass(vardatas:arrayofInteger;left,mid,right:Integer);vartmpArr:arrayofInteger;arrLen:Integer;i,k:Integer;begin1,begin2,end1,end2:Integer;beginarrLen:=right-left+1;SetLength(tmpArr,arrLen);begin1:=left;end1:=mid;begin2:=mid+1;end2:=right;k:=0;while((begin1=end1)and(begin2=end2))dobeginif(datas[begin1]datas[begin2])thenbegintmpArr[k]:=datas[begin1];Inc(begin1);endelsebegintmpArr[k]:=datas[begin2];Inc(begin2);end;inc(k);end;while(begin1=end1)dobegintmpArr[k]:=datas[begin1];Inc(begin1);Inc(k);end;while(begin2=end2)dobegintmpArr[k]:=datas[begin2];Inc(begin2);Inc(k);end;fori:=0to(right-left)dobegindatas[left+i]:=tmpArr[i];end;end;//排序主函數(shù),left是數(shù)組左下標(biāo),0開(kāi)始。right是數(shù)組右下標(biāo)。procedureTForm1.MergeSort(vardatas:arrayofInteger;left,right:Integer);varmid:Integer;i:Integer;beginmid:=0;if(leftright)thenbeginmid:=(right+left)div2;showLog('中間索引:'+inttostr(mid));MergeSort(datas,left,mid);MergeSort(datas,mid+1,right);MergePass(datas,left,mid,right);showLog('---'+getArrayString(datas));//顯示數(shù)組中間狀態(tài)end;end;//調(diào)用方法:procedureTForm1.btn1Click(Sender:TObject);varinArr:array[0..9]ofInteger;beginCopyMemory(@inArr[0],@CTabls[0],SizeOf(Integer)*10);showLog('輸入數(shù)據(jù):'+getArrayString(inArr));MergeSort(inArr,0,High(inArr));showLog('輸出數(shù)據(jù):'+getArrayString(inArr));end;

php 從數(shù)據(jù)庫(kù)中取出數(shù)據(jù)放入數(shù)組并排序

$i=1

while ( $row = 數(shù)據(jù)集 ) {

echo $row['id'].','.$row['num'].' ';

if ( $i==10 ) {

$i=0;

echo 'br /'; // html中的換行符

}

$i++;

}


分享標(biāo)題:php數(shù)據(jù)歸并排序,歸并排序 php
文章源于:http://weahome.cn/article/hcesed.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部