1. 定理1:在最坏情况下,任何比较排序算法都需要做
定理2:堆排序和归并排序都是渐近最优的比较排序算法。
2. 计数排序的思想是:对每一个输入元素x,确定小于x的个数,前提条件时假设n个输入元素中的每一个都是在0到k区间内的一个整数。
3. 计数排序算法的输入是数组A[1..n],Alength=n,数组B[1..n]存放排序的输出,C[0..k]提供临时存储空间
COUNT-SORT(A,B,k)
//初始化操作
let C[0..k]be a new array
for i = 0 tok
C[i]= 0
//C[i]中保存的是等于i的元素的个数
for j = 1 toA.length
C[A[j]]= C[A[j]] + 1
//通过相加,确定对每一个i=0,…,k,有多少输入元素是小于等于i的
for i = 1 tok
C[i]= C[i] + C[i-1]
for j =A.length downto 1
B[C[A[j]]]= A[j]
C[A[j]]= C[A[j]] – 1
最后将每个元素A[j]放到它在输出数组B中的正确位置。如果n个元素互异,对每一个A[j]值来说,C[A[j]]就是A[j]在输出数组中的最终正确位置,因为所有的元素可能并不互异,所以每将一个值A[j]放入数组B中以后,都要讲C[A[j]]的值减1.这样当下一个值等于A[j]的输入元素时,该元素可直接放到输出数组A[j]的前一个位置上。
4. 当k为O(n)时,计数排序的运行时间为 ,计数排序的重要性质就是它是稳定的,即具有相同值得元素在输出数组中的相对次序与它们在输入数组中的相对次序相同。
5. 计数排序的程序代码如下:
#include<stdio.h>
#include<stdlib.h>
intCountSort(int *pData,int nLen)
{
int *pCount=NULL; //保存记录数据的指针
pCount=(int*)malloc(sizeof(int)*nLen); //申请保存的空间
//初始化计数为0
for (int i=0;i<nLen;i++)
{
pCount[i]=0;
}
//统计数组中相同元素的个数
for (int i=0;i<nLen;i++)
{
pCount[pData[i]]++;
}
//确定不比该位置大的数据个数
for (int i=1;i<nLen;i++)
{
pCount[i]+=pCount[i-1];
}
int *pSort=NULL; //保存排序结果的指针
pSort=(int *)malloc(sizeof(int)*nLen);
for (int i=nLen-1;i>=0;i--)
{
pSort[pCount[pData[i]]-1]=pData[i];
--pCount[pData[i]];
}
for (int i=0;i<nLen;i++)
{
pData[i]=pSort[i];
}
free(pCount);
free(pSort);
return 1;
}
intmain()
{
int nData[]={8,6,3,6,5,8,3,5,1,0};
CountSort(nData,10);
for (int i=0;i<10;i++)
{
printf("%d",nData[i]);
}
printf("\n");
return 0;
}