常見排序方式

2021-07-11 23:46:46 字數 3114 閱讀 8783

待排序資料較少時用時少

從陣列的第二個元素(即待插入的元素)開始,分別與之前的元素進行比較,若滿足一定的條件就將此元素插入此位置。

例對[8,9,6,7,2]進行排序。

第一次排序:9為待插入的元素(i=1),與其之前元素8(j=0)進行比較,8>9,不滿足條件,9要插入的位置為1(j=0+1),即9位置不發生變化;此時待排序元素順序為[8,9,6,7,2]

第二次排序:6為帶插入的元素(i=2).

- 首先與其之前元素9(j=1)進行比較,j>=0並且9>6,滿足條件,把9放入6的位置上($ary[$j+1]=$ary[$j];($ary[2]=$ary[1])),此時待排序元素順序為[8,9,9,7,2],j=0;

- 繼續進行比較,6與陣列的第乙個元素(即序號為j=0)進行比較,依然滿足條件,把8放入9的位置上($ary[$j+1]=$ary[$j];($ary[1]=$ary[0])),此時待排序元素順序為[8,8,9,7,2],j=-1(發生了自減);

- 由於j>=0不再成立,因此while部分到此結束,把6放入位置0(此時j+1=0)處,此時待排序元素順序為[6,8,9,7,2]

接下來依次進行剩下排序

function

insertsort

(array $ary)

$ary[$j+1]=$val;//把元素插入指定位置

}return

$ary;

}

流行低效

原理:反覆交換相鄰的未按次序排列的元素

例對[8,9,6,7,2]進行排序。

第一次排序:

- i=0;j=4;

- 4>1(i+1),執行第二個for部分

- 位置4(j)上元素為2,位置3(j-1)上元素為7,2<7進行交換,此時元素順序變化為[8,9,6,2,7],j值為3

- 3>1(i+1),繼續執行第二個for部分

- 位置3(j)上元素仍為2,位置2(j-1)上元素為6,2<6進行交換,此時元素順序變化為[8,9,2,6,7],j值為2

- 依次比較,直到最小元素(2)冒泡至位置i(0),成為第乙個元素,此時元素順序變化為[2,8,9,6,7],j值為0,i為0,0(j)<1(i+1),不再執行第二個for部分,i自加,值為1,重複之上步驟將第二小元素(6)冒泡至位置i(1)成為第二個元素

- 以此繼續比較,直到i為3(即倒數第二個元素,剩下最後乙個元素無須比較)

function

bubblesort

(array $ary)}}

return

$ary;

}

使用了遞迴

原理:根據資料裡的第乙個元素val把所有元素分為兩個陣列,比val大的放入right陣列,比val小的放入left陣列;按照此方法把right、left陣列繼續分割,直到分割為乙個個元素的陣列;最後把這些陣列合併即可

function

quciksort

(array $ary)else

if($ary[$i]>$val)

}$left=quciksort($left);//對較小元素進行再次分割

$right=quciksort($right);//對較大元素進行再次分割

//合併元素

return array_merge($left,array($val),$right);

}else

}

原理:首先通過依次比較選擇出最小的值,將最小值放入陣列開始位置,重複這一步驟,直到完成所有排序。

function

selectsort

(array $ary)

}

//把最小值放入位置i處

if($min!=$i)

}return

$ary;

}

使用了遞迴

原理:把待排序陣列從中間分開,一分為二,並按此方法(即遞迴),拆分為單個元素陣列,按照順序(12\34\56\78)兩兩組合為有序陣列,再將生成的有序陣列合併為大的有序陣列,重複操作,直到合併成乙個有序陣列。

例:對[8,9,6,7,2]使用歸併排序法

- 第一:拆分[8,9] [6,7,2]

- 第二:拆分左側陣列[8][9]

- 第三:合併為有序陣列[8,9]

- 第四:拆分右側陣列[6,7,2]

- 第五:繼續拆分右側陣列[6][7,2]

- 第六:[6]無需拆分,繼續拆分右側陣列[7][2]

- 第七:合併為有序陣列[2,7]

- 第八:合併為有序陣列[2,6,7]

- 第九:兩個大陣列[8,9][2,6,7]合併為有序陣列[2,6,7,8,9]

function

merge

($ary,$bry)

return array_merge( $cry,$ary,$bry);

}//主排序程式

function

mergesort

(array $ary)

$mid=intval($count/2);

$left=array_slice($ary, 0,$mid);

$right=array_slice($ary, $mid);

$left=mergesort($left);

$right=mergesort($right);

return merge($left,$right);

}

快速排序法,歸併排序法等其他使用了遞迴的排序法,都是把問題分解為一些小問題,這些小問題與原問題問題一樣,只是包含的元素更少,更容易解決,遞迴地求解出這些小問題,如果小問題的規模更小(一般情況下都是分解為單元素的陣列),則停止遞迴,進行求解,最後把解決過的小問題合併,直至合併為乙個陣列。

PHP陣列幾種常見的排序方式

php陣列幾種常見的排序方式 1.氣泡排序 2.選擇排序 3.插入排序 4.快速排序 arr array 28,6,19,5,43,21,10,66 排序陣列 氣泡排序 思路分析 在需要排序的一組數中,對當前未排序的數從前往後即相鄰的數兩兩比較,讓較大的數往下沉 較小的數往上冒 即 當相鄰的兩個數進...

Java中幾種常見的排序方式

日常操作中常見的排序方法有 氣泡排序 快速排序 選擇排序 插入排序 希爾排序,甚至還有基數排序 雞尾酒排序 桶排序 鴿巢排序 歸併排序等。一 氣泡排序 氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有...

常見排序演算法

一.選擇排序 1.概念 每次從無序的子陣列裡面選擇最小的數,放在有序區的後面 既與無序區的首元素交換 不穩定排序 時間複雜度o n 2 輔助儲存o 1 2.實現 int selection sort int a,int len len為陣列元素個數 二.氣泡排序 1.概念 重複訪問數列n 1次,每次...