待排序資料較少時用時少從陣列的第二個元素(即待插入的元素)開始,分別與之前的元素進行比較,若滿足一定的條件就將此元素插入此位置。
例對[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次,每次...