許多人都說演算法是程式的核心,演算法的好壞決定了程式的質量。因此對於基本的排序演算法還是應該掌握的,它是程式開發的必備工具。這裡介紹氣泡排序,插入排序,選擇排序,快速排序等等演算法,分析一下演算法的思路。
1. 氣泡排序
思路分析:在要排序的一組數中,對當前還未排好的序列,從前往後對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即,每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
**實現:
/**
* 氣泡排序
* @param array $arr
* @return array
*/function
bubblesort
($arr)}
}return
$arr
;}
2.選擇排序
思路分析:在要排序的一組數中,選出最小的乙個數與第乙個位置的數交換。然後在剩下的數當中再找最小的與第二個位置的數交換,如此迴圈到倒數第二個數和最後乙個數比較為止。
**實現:
/**
* 選擇法排序
* @param array $arr
* @return array
*/function
choicesort
($arr)}
// 把當前值放到算好的位置
$arr
[$ipos]=
$arr[$i
];// 把當前值換成算好的值
$arr[$i
]=$itemp;}
return
$arr
;}
3.插入排序
思路分析:在要排序的一組數中,假設前面的數已經是排好順序的,現在要把第n個數插到前面的有序數中,使得這n個數也是排好順序的。如此反覆迴圈,直到全部排好順序。
**實現:
/**
* 插入法排序
* @param array $arr
* @return array
*/function
insertsort
($arr
)$arr
[$ipos+1
]=$itemp;}
return
$arr
;}
4.快速排序
思路分析:選擇乙個基準元素,通常選擇第乙個元素或者最後乙個元素。通過一趟掃瞄,將待排序列分成兩部分,一部分比基準元素小,一部分大於等於基準元素。此時基準元素在其排好序後的正確位置,然後再用同樣的方法遞迴地排序劃分的兩部分。
**實現:
/**
* 快速排序
* @param array $arr
* @return array
*/function
quicksort
($arr
)else
}// 如果左索引有值 則對左索引排序if(
$l>1)
// 排序後的陣列
$new_arr
=$left
;// 將當前陣列第乙個放到最後
$new_arr
=$arr[0
];// 如果又索引有值 則對右索引排序if(
$r>1)
// 根據右索引的長度再次增加資料
for($i=
0;$i<$r;
$i++
)return
$new_arr;}
//快速排序
function
quicksort
($arr
)$left
=$right
=array()
;//迴圈比較
for($i=
1;$i<
$length;$i
++)else
}// 遞迴排序劃分好的2邊
$left
=quicksort
($left);
$right
=quicksort
($right);
//合併排序後的資料
return
array_merge
($left
,array
($arr[0
]),$right);
}
5.希爾排序
思路分析:將陣列按指定步長分隔成若干子串行,然後分別對子序列進行排序(在這是直接)
**實現:
/**
* 希爾排序
* @param array $arr
* @return array
*/function
shellsort
($arr)}
}$k=floor($k
/2);
}return
$arr
;}
6.堆排序
思路分析:調整子堆的為大根堆的過程
**實現:
/**
* 堆排序
* @param array &$arr 陣列
* @param int $s 子堆的根的位置
* @param int $m 堆最後乙個元素位置
* @return array
*/function
heapadjust(&
$arr,$s
,$m)if
($tmp
>=
$arr[$j
])$arr[$s
]=$arr[$j
];$s=
$j;}$arr[$s
]=$tmp;}
/** * 堆排序
* @param array $arr 陣列
* @return array
*/function
heapsort
($arr
)// 依次把根節點調換至最後乙個位置,再次調整堆為大根堆,找到次最大值,
// 依次類推得到乙個有序陣列
for($n=
$len-1
;$n>0;
$n--
)return
$arr
;}
7.歸併排序
思路分析:這裡實現的是兩路歸併(分別將有序的arr
1[s.
.m]、
arr1[s..m]、
arr1[s
..m]
、arr2[m+1…n]歸併為有序的$arr2[s…n])
**實現:
/**
* 歸併排序
* @param array &$arr1
* @param array &$arr2
* @param int $s
* @param int $m
* @param int $n
*/function
merge(&
$arr1,&
$arr2,$s
,$m,$n
)else}if
($i<=$m)
}elseif(
$j<=$n)
}}/** * 遞迴形式的兩路歸併
* @param array &$arr1
* @param array &$arr2
* @param int $s
* @param int $t
*/function
msort(&
$arr1,&
$arr2,$s
,$t)else
}/**
* 對一位陣列$arr[0..n-1]中的元素進行兩路歸併
* @param array $arr
* @return array
*/function
mergesort
($arr
)
8.交換法排序
**實現:
/**
* 交換法排序
* @param array $arr
* @return array
*/function
swapsort
($arr)}
}return
$arr
;}
7種php基本排序實現方法
本文總結了一下常用的7種排序方法,並用php語言實現。1 直接插入排序 直接插入排序,插入排序的思想是 當前插入位置之前的元素有序,若插入當前位置的元素比有序元素最後乙個元素大,則什麼也pqbkgkiqpn不做,否則在有序序列中找到插入的位置,並插入 function insertsort arr ...
PHP實現四種基本排序演算法
許多人都說演算法是程式的核心,演算法的好壞決定了程式的質量。作為乙個初級phper,雖然很少接觸到演算法方面的東西。但是對於基本的排序演算法還是應該掌握的,它是程式開發的必備工具。這裡介紹氣泡排序,插入排序,選擇排序,快速排序四種基本演算法,分析一下演算法的思路。許多人都說演算法是程式的核心,演算法...
PHP實現四種基本排序演算法
前提 分別用氣泡排序法,快速排序法,選擇排序法,插入排序法將下面陣列中的值按照從小到大的順序進行排序。arr 1,43,54,62,21,66,32,78,36,76,39 思路分析 在要排序的一組數中,對當前還未排好的序列,從前往後對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。...