最近学到了C语言中的排序算法。
猴子算法
第一个学到的算法叫猴子算法
在计算机科学中,Bogo 排序(bogo-sort)是个既不实用又原始的排序算法。
其原理等同将一堆卡片抛起,落在桌上后检查卡片是否已整齐排列好,若非就再抛一次。
其名字源自 Quantum bogodynamics,又称 bozo sort、blort sort 或猴子排序(参见无限猴子定理)。。
-- 摘自维基百科
其原理等同将一堆卡片抛起,落在桌上后检查卡片是否已整齐排列好,若非就再抛一次。
其名字源自 Quantum bogodynamics,又称 bozo sort、blort sort 或猴子排序(参见无限猴子定理)。。
-- 摘自维基百科
其中用两种写法实现了猴子算法,一种是自己编写,一种是出题者提供的解法,但我写的猴子耗时一般在五秒以内,而提供的猴子我竟然尝试了451秒!
下面贴上两种代码:
第一种是我写的:
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
void bogo_sort(int *,int);
void bogo_sort(int *array,int length)
{
int x;
int n1,n2,i,temp;
srand(time(NULL));//随机数种子
for(x=0;;x++)
{
//交换
for(i=0;i<100;i++)
{
int i3;
n1=rand()%9;
n2=rand()%9;
temp=*(array+n1);
*(array+n1)=*(array+n2);
*(array+n2)=temp;
}
//检验是否正确:
int i2;
for(i2=0;i2<=length-1;i2++)
{
if(*(array+i2)>*(array+i2+1))
break;
}
if(i2==length-1)
break;
}
}
int main(void)
{
int array[] = {73, 108, 111, 118, 101, 70, 105, 104, 67};
int i, length;
time_t begin, end;
begin = time(NULL);
length = sizeof(array) / sizeof(array[0]);
bogo_sort(array, length);
printf("排序后的结果是:");
for (i = 0; i < length; i++)
{
printf("%d ", array[i]);
}
putchar('\n');
end = time(NULL);
printf("总共耗时:%ld秒\n", end - begin);
return 0;
}
第二种是出题者提供的:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int in_order(int array[], int length);
void shuffle(int array[], int length);
void bogo_sort(int array[], int length);
int in_order(int array[], int length)
{
int i = 0;
while (array[i] <= array[i+1] && ++i < length - 1)
;
if (i == length - 1)
{
return 1;
}
else
{
return 0;
}
}
void shuffle(int array[], int length)
{
int index, temp, i;
static int t1, t2;
srand(t1);
t1 = rand();
t2 = time(NULL);
srand(t1+t2);
for (i = 0; i < length; i++)
{
index = rand() % (length - i) + i;
if (index != i)
{
temp = array[i];
array[i] = array[index];
array[index] = temp;
}
}
}
void bogo_sort(int array[], int length)
{
while (!in_order(array, length))
{
shuffle(array, length);
}
}
int main(void)
{
int array[] = {73, 108, 111, 118, 101, 70, 105, 104, 67};
int i, length;
time_t begin, end;
begin = time(NULL);
length = sizeof(array) / sizeof(array[0]);
bogo_sort(array, length);
printf("排序后的结果是:");
for (i = 0; i < length; i++)
{
printf("%d ", array[i]);
}
putchar('\n');
end = time(NULL);
printf("总共耗时:%ld秒\n", end - begin);
return 0;
}