前段时间在问答上回答问题时,用脑洞开了一种新的排序算法【本人涉猎范围不大,所以个人认为是新的,如果雷同,见笑了】,简短的说就是追求速度,用空间换时间。以下是源代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000
#define range 10000 //请注意这个range的作用!
void space(int *a)
{
int i,j=0;
int temp[range];// 这是副本数组,它的作用是当做重排目标数组的中转站。
for (i=0; i<range; i++) temp[i] = 0; // 把temp数组的所有元素初始化为0。
for (i=0; i<MAX; i++) temp[a[i]]++; //遍历目标数组,将目标数组中出现的
//数值元素设为temp数组的下标,
//以统计这个数值共出现了多少次。
for (i=0; i<range; i++)
{
while( temp[i] != 0) // 检测i这个数值是否在目标数组中出现过,0表示没出现过。
{
a[j++] = i; // 用出现过的i数值重新为目标数组赋值。
temp[i]--;
}
}
}
int main()
{
int i;
int arr[MAX]; //这个是待排序的目标数组。
for (i=0; i<MAX;i++) arr[i] = rand()%range; // 初始化目标数组。
for(i=0; i<MAX; i++) printf("%d ",arr[i]);
system("pause");
space(arr); // 用这个函数对目标数组进行排序
for (i=0; i<MAX;i++) printf("%d ",arr[i]);
system("pause");
return 0;
}
这个算法的优点就是快,虽然没有经过比较测试,但我可以肯定它比我所知道的其它算法都要快。接下来就要说缺点了,这个算法有两个致命的缺点:首先,这种算法应该很难对浮点数进行排序【之所以用“应该很难”四字,是因为本人水平有限,不清楚浮点数的原理以及具体表示方法。顺带说一句,虽然没有经过实际代码验证,但我目测思考了下,它可以对所有整数有效,包括负数】;其次,既然此算法的特点是用空间换时间,那么程序运行时所剩的剩余空间就很可能决定这种算法的生死,在本文源代码中,range限定在了10000以内,如果把range定义为一百万、一千万甚至一个亿呢?PS本人没有精确的测试,但当我把range调成1000000时,程序就无法运行了