第一个,生成look-and-say sequence
function createNext($pre, $elem = '', $count = 0)
{
$len = strlen($pre);
$string = '';
$a = substr($pre, 0,1);
if($elem == $a) {
$count += 1;
}else {
if($count != 0) {
$string .= $count . $elem;
}
$elem = $a;
$count = 1;
}
if($len > 1) {
$string .= createNext(substr($pre, 1), $elem, $count);
}else {
$string .= $count . $elem;
}
return $string;
}
$stringList = ['1'];
for($i = 1; $i<10;$i++)
{
$stringList[$i] = createNext((string)$stringList[$i-1]);
}
echo "<pre>";
print_r($stringList);
第二个,分治排序
function mergeSort($arr, $left, $right) {
if($left >= $right) {
return $arr;
}
$middle = floor(($left + $right)/2);
$arr = mergeSort($arr, $left, $middle);
$arr = mergeSort($arr, $middle+1, $right);
$arr = merge($arr, $left, $middle, $right);
return $arr;
}
function merge($arr, $left, $middle, $right) {
$len = ($right + 1 - $left);
$l = $left;
$r = $middle + 1;
$a = $arr;
for($i = 0; $i < $len; $i++) {
if($l > $middle) {
$a[$i+$left] = $arr[$r];
$r++;
}elseif ($r > $right) {
$a[$i+$left] = $arr[$l];
$l++;
}elseif ($arr[$l] < $arr[$r]) {
$a[$i+$left] = $arr[$l];
$l++;
}else {
$a[$i+$left] = $arr[$r];
$r++;
}
}
return $a;
}
$arr = [12,33,5,23,3,5,6,7,3,1];
$arr = mergeSort($arr, 0, 9);
for($i=0;$i<10;$i++) {
echo $arr[$i];
echo " ";
}
额,第二种算法的c版
#include <stdio.h>
#include <stdlib.h>
void mergeSort(int arr[], int left, int right);
void merge(int arr[], int left, int middle, int right);
int main()
{
const int LEN = 12;
int arr[LEN];
int i = 0;
for(i=0;i<LEN;i++) {
scanf("%d", &arr[i]);
}
mergeSort(arr, 0, LEN-1);
for(i=0;i<LEN;i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
void mergeSort(int arr[], int left, int right)
{
if(left >= right) {
return;
}
int middle = (left + right)/2;
mergeSort(arr, left, middle);
mergeSort(arr, middle+1, right);
merge(arr, left, middle, right);
}
void merge(int arr[], int left, int middle, int right)
{
int len = right - left + 1;
int right_start = middle + 1;
int left_start = left;
int arr_new[len];
int i = 0;
for(i=0; i<len; i++) {
arr_new[i] = arr[left+i];
}
for(i=0; i< len; i++) {
if(left_start > middle) {
arr_new[i] = arr[right_start];
right_start += 1;
}else if(right_start > right) {
arr_new[i] = arr[left_start];
left_start += 1;
}else if(arr[left_start] < arr[right_start]) {
arr_new[i] = arr[left_start];
left_start += 1;
}else {
arr_new[i] = arr[right_start];
right_start += 1;
}
}
for(i=0; i<len; i++) {
arr[left+i] = arr_new[i];
}