记录两个算法

第一个,生成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];
	}

  

posted @ 2017-08-08 19:19  牛奶无花果  阅读(166)  评论(0编辑  收藏  举报