计数排序的三种方法

// Count_Sort.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
using namespace std;

const int len = 100;
class CountSort  //计数排序类
{
public:
	CountSort();
	~CountSort();
	void fristsort();
	void secondsort();
	void thirdsort();
    friend ostream& operator<<(ostream& out,const CountSort& countsort);
private:
	int *arr;
	int length;
};

CountSort::CountSort():length(len)
{
   arr = new int[length];
   for (int i=0; i<length; i++)
   {
	   arr[i] = rand()%1000;
   }
}

CountSort::~CountSort()
{
	delete[] arr;
	arr = NULL;
}

ostream& operator<<(ostream& out,const CountSort& countsort)
{
  for (int i=0; i<countsort.length; i++)
  {
    cout<<countsort.arr[i]<<" ";
  }
  cout<<endl;
  return out;
}

/*
第一种方法:对于原数组中每个元素,count数组记录比它小的元素个数,这个数即为该元素在新的排好序的数组下标
*/
void CountSort::fristsort()
{
	int *count = new int[length]; //对于原数组中每个元素,count数组记录比它小的元素个数
	memset(count,0,length*sizeof(int));
	int *rarr = new int[length]; //rarr是新排好序的数组
	memset(rarr,0,length*sizeof(int));
	for (int i=0; i<length; i++)
	{   
		for (int j=i+1; j<length; j++)
		{
			if (arr[j] < arr[i])
		 {
			 count[i]++;
		 }
			else
		 {
			 count[j]++;
		 }
		}
		rarr[count[i]] = arr[i];
	}

	for (int t=0; t<length; t++)
	{
		arr[t] = rarr[t];
	}

	delete[] count;
	delete[] rarr;
}

/*
第二种方法:用一个临时数组记录原数组中每个元素出现的次数
*/
void CountSort::secondsort()
{
   int max = 0;//max记录数组中最大的元素值

   for (int i=0; i<length; i++)
   {
	   if (arr[i] > max)
	   {
		   max = arr[i];   //找到最大值
	   }
   }

   int *count = new int[max+1];//count数组记录数组中每个元素出现的次数
   memset(count,0,(max+1)*sizeof(int));
   int *rarr = new int[max+1]; //rarr数组存放排好序的元素
   memset(rarr,0,(max+1)*sizeof(int));

   for (int i=0; i<length; i++)
   {
	   count[arr[i]]++;  //记录元素的个数
   }

   for (int j=1; j<=max; j++)
   {
	   count[j]+=count[j-1];
   }

   for (int t=length-1; t>=0; t--)
   {
       rarr[count[arr[t]]-1] = arr[t];
	   count[arr[t]]--;
   }

   for (int z=0; z<length; z++)
   {
	   arr[z] = rarr[z];
   }

   delete[] count;
   delete[] rarr;
}

/*
第三种方法:用一个临时数组记录原数组中每个元素出现的次数
*/
void CountSort::thirdsort()
{
	int max = 0;//max记录数组中最大的元素值

	for (int i=0; i<length; i++)
	{
		if (arr[i] > max)
		{
			max = arr[i];   //找到最大值
		}
	}

	int *count = new int[max+1];//count数组记录数组中每个元素出现的次数
	memset(count,0,(max+1)*sizeof(int));	

	for (int i=0; i<length; i++)
	{
		count[arr[i]]++;  //记录元素的个数
	}

	int z=0;
	for (int i=0; i<=max; i++)
	{
		while(count[i]-- > 0)
		{
			arr[z++]=i;
		}
	}

	delete[] count;	
}
 
int _tmain(int argc, _TCHAR* argv[])
{
	CountSort *pcountsort = new CountSort();
	cout<<"排序前:"<<endl;
	cout<<*pcountsort;

	//pcountsort->fristsort();
	pcountsort->secondsort();
    //pcountsort->thirdsort();

	cout<<"排序后:"<<endl;
    cout<<*pcountsort;
	system("pause");
	return 0;
}


vs2008运行正确,如有问题,请各位大牛指正!

计数排序假设n个输入元素中的每一个都是介于0到k之间的整数,此处k为某个整数,当 k= O(n)时, 计数排序的运行时间为O(n)。

计数排序的基本思想:对每一个输入元素x,确定出小于或等于x的元素个数,有了这一信息就可以把x直

接放到它最终在输出数组中的位置。

不适用情况:数组中有负数或有少量数极大

算法分析

1.时间复杂度为 O(n)。

2.空间复杂度为 O(n)。

3.计数排序不是原地排序算法(指不申请多余的空间来进行的排序);

                是稳定排序算法(指在排序前后具有相同关键字之间的相对顺序保持不变);

                不是基于比较的排序算法,比较排序算法的时间复杂度为O(n*logn)。


你可能感兴趣的:(null,delete,Class)