一種超級快的排序算法

來源知乎:一種超級快的排序算法

/**
 * 適用於int型數據的排序
 */
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#define LEN 100000 //visual studio 2017實測:數組長度最大取值爲256375,超過直接崩潰。
/*超級排序*/
inline int supersort(unsigned int *a, int len)
{
	unsigned int *b = malloc(sizeof(unsigned) * len);
	int sum[256] = { 0 }, sum1[256] = { 0 }, sum2[256] = { 0 }, sum3[256] = { 0 };
	for (int i = 0; i < len; i++)
	{
		++sum[a[i] & 255];
		++sum1[(a[i] >> 8) & 255];
		++sum2[(a[i] >> 16) & 255];
		++sum3[a[i] >> 24];
	}
	for (int q = 1; q <= 255; ++q)
	{
		sum[q] += sum[q - 1];
		sum1[q] += sum1[q - 1];
		sum2[q] += sum2[q - 1];
		sum3[q] += sum3[q - 1];
	}
	for (int q = len - 1; q >= 0; --q)
		b[--sum[a[q] & 255]] = a[q];
	for (int q = len - 1; q >= 0; --q)
		a[--sum1[(b[q] >> 8) & 255]] = b[q];
	for (int q = len - 1; q >= 0; --q)
		b[--sum2[(a[q] >> 16) & 255]] = a[q];
	for (int q = len - 1; q >= 0; --q)
		a[--sum3[b[q] >> 24]] = b[q];
	free(b);
	return *a;
}
int main(void)
{
	int array[LEN] = { 0 };//只支持整數排序
	clock_t begin, end;     //捕獲時間變量
	double cost;			//運行時間
	srand((unsigned)time(NULL));
	for (int i = 0; i < LEN; i++)
	{
		array[i] = rand() % 100;
	}
	/*捕獲排序消耗的時間*/
	begin = clock();
	*array = supersort(array, LEN);
	end = clock();
	cost = (double)(end - begin) / CLOCKS_PER_SEC;
	printf("\n排序時消耗的時間: %lf secs\n", cost);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章