记录两个算法
第一个,生成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]; }