【算法】計數排序

計數排序是一種線性時間排序方法,在以下條件滿足時對n個數的數組A[]進行排序,其時間爲O(n):

一:數組A[]中的元素的大小均小於k

二:k=O(n)


算法代碼如下:


#include <stdio.h>
#include <stdlib.h>
/**
 * 計數排序
 * a[] (input)要排序的數組
 * b[] (output) 排序結果
 * n	(input) 排序的數字的個數
 * k	(input)對所有的i滿足:a[i]<k
 */
void count_sort(int a[],int b[],int n,int k)
{
	int i = 0;
	int* c = (int*)malloc(sizeof(int)*k);
	//初始化
	for(i = 0 ; i < k; i++)
	{
		*(c+i) = 0;
	}

	//計算各個元素的個數
	for( i = 0; i < n; i++)
	{
		(*(c+a[i]))++;
	}
	for(i = 1; i < k; i++)
	{
	    *(c+i) += *(c+i-1);
	}
	//輸出
	for(i = n-1; i >= 0; i--)
	{
		b[*(c+a[i])-1] = a[i];
		(*(c+a[i]))--;
	} 
	free(c);
}


int main()
{
	int i;
	int a[] = {3,4,4,5,3,3,2,4,12,6,8};
	int length = sizeof(a)/sizeof(a[0]);
	int* b = (int*)malloc(sizeof(int)*length);
	count_sort(a,b,length,47);
	for(i = 0; i < length; i++)
		printf("%d\t",b[i]);	

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章