【算法導論】c++實現計數排序

計數排序的基本思想爲:對每一個輸入的元素x,確定出小於x的元素的個數。有了這一信息,那麼就可以把x直接放到相應的位置上。

特點:

1 需要臨時的存儲空間,如果排序數據範圍特別大時,空間開銷很大。

2 適合於排序0 - 100以內的數據。

3 排序的時間複雜度爲O(n)。

#include <iostream>
#include <string>

const int size = 100;
int * array_list;
int * array_list_a;
void print_list(int * ,int );
void count_sort(int * ,int * ,int );

int main(int argc,char * argv[])
{
	
	array_list = new int [sizeof(int)*size];
	array_list_a = new int [sizeof(int)*size];
	srand(0);
	for(int i=0;i<size;i++)
	{/*隨機的填充數組元素*/
		int ran_num=rand()% size;
		array_list[i] = ran_num;
	}
	print_list(array_list,size);
	count_sort(array_list, array_list_a, size);
	print_list(array_list_a,size);
	delete array_list;
	delete array_list_a;
	return 0;
}
/*假設輸入的數據都是介於0 - k 的數*/
void count_sort(int * array_list_a,int * array_list_b,int k)
{
	int * c = new int [sizeof(int) * k];
	for(int i=0;i<k;i++)
	{/*初始化臨時數組*/
		c[i] = 0;
	}
	for(int i=0;i<size;i++)
	{/*對於輸入數組的重複的數值進行統計,在臨時數組c的相應的位置予以記錄*/
		c[array_list_a[i]] += 1; 
	}
	for(int i=1;i<k;i++)
	{/*小於當前數據元素的個數*/
		c[i] += c[i-1];
	}
	for(int j=size-1;j>=0;j--)
	{
		array_list_b[c[array_list_a[j]] - 1] = array_list_a[j];
		c[array_list_a[j]] -= 1;
	}
	delete c;
}
void print_list(int * array_list,int length)
{
	for(int i=0;i<length;i++)
	{
		std::cout<<array_list[i]<<"\t";
	}
	std::cout<<std::endl;
}


發佈了104 篇原創文章 · 獲贊 66 · 訪問量 46萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章