計數排序(適用於在一定範圍內的整數排序,取值範圍不是很大的情況下,效率快過時間複雜度爲O(nlogn)的排序)
計數排序是一個非基於比較的排序算法,該算法於1954年由 Harold H. Seward 提出。它的優勢在於在對一定範圍內的整數排序時,它的複雜度爲Ο(n+k)(其中k是整數的範圍),快於任何比較排序算法。
基本思想
首先根據原數組的大小創建一個相同的新數組,用於存放原數組中計數完畢的數據;對於一個待排序序列中的元素X,計算待排序序列中比X小的數,假如有A個,就把X放在新數組的第A個下標的位置上,依次計算第二個,第三個等等的數據,直到原數組的數據全部計數完畢,就得到了一個排序完成的新數組,在把新數組的數據全部賦值給原數組。
代碼實現
#include<stdio.h>
#include<stdlib.h>
#define MAXNUM 80
//計數排序法
void Count_Sort(int a[],int n)
{
int i,j,count,*data;
data = (int *)malloc(sizeof(int)*n); //動態分配內存空間
for ( i = 0; i < n; i++) //初始化data爲0
{
data[i] = 0;
}
for ( i = 0; i < n; i++)
{
count = 0; //計數值
for ( j = 0; j < n; j++) //掃描待排序數組
{
if (a[j] < a[i]) //統計比a[i]值小的值的個數
{
count++;
}
}
while (data[count] != 0)//對於相等非0的數據,應向後措一位。數據爲0時,因數組data被初始化爲0,故不受影響。
/* 注意此處應使用while循環進行判斷,若用if條件則超過三個重複值後有0出現 */
{
count++;
}
data[count] = a[i]; //把計數完畢的數據存放到data中的對應位置
}
for ( i = 0; i < n; i++) //把排序完的數據複製到a中
{
a[i] = data[i];
}
free(data); //釋放data
data = NULL;
}
void main()
{
int i;
/* int a[MAXNUM];
printf("請輸入十個待排序數據");
for (int j = 0; j < MAXNUM; j++)
{
scanf("%d",&a[j]);
} */
int a[MAXNUM]={12,23,69,65,45,23,69,56,85,4212,23,69,65,45,23,69,56,85,42,12,23,69,65,45,23,69,56,85,4212,23,69,65,45,23,69,56,85,42,23,56,12,23,69,65,45,23,69,56,85,4212,23,69,65,45,23,69,56,85,42,12,23,69,65,45,23,69,56,85,4212,23,69,65,45,23,69,56,85,42,23,56};
Count_Sort(a,MAXNUM);
for ( i = 0; i < MAXNUM; i++)
{
printf("%d ",a[i]);
}
system("pause"); //防止控制檯閃退
}
參考文獻
漫畫:什麼是計數排序?
百度百科