时间复杂度 最坏时间复杂度 空间复杂度 稳定性
计数排序 n+k n+k n+k 稳定
基数排序 n*m n*m m 稳定
计数排序(桶排序)
void countSort(int arr[],size_t len){
int max = arr[0];
int min = arr[0];
for(int i=0;i<len;i++){
if(max < arr[i]){
max = arr[i];
}
if(min > arr[i]){
min = arr[i];
}
}
int cnt = max+1-min;//最大值和最小值之间相差多少个数
int *pCnt = calloc(cnt, sizeof(int));//pCnt[0] pCnt[cnt-1]
//pCnt[0] == 0 代表 min这个数个数为0
//pCnt[0] == 1 代表 min这个数有一个
//pCnt[i] == n 代表 min+i 这个数有 n 个
for(int i=0;i<len;i++){//arr[i]这个值 pCnt[arr[i]-min]
pCnt[arr[i]-min]++; //arr[i]这个值的个数加1
}
int j = 0;
for(int i=0;i<cnt;i++){
while(pCnt[i] != 0){
arr[j++] = i+min;
--pCnt[i];
}
}
free(pCnt);
}
基数排序
typedef struct Queue{
int* m_vect;
size_t cap;
size_t index;
size_t size;
}Queue;
void init(Queue *que,size_t cap){
que->m_vect = malloc(sizeof(int)*cap);
que->cap = cap;
que->index = 0;
que->size = 0;
}
void destroy(Queue *que){
free(que->m_vect);
}
bool isEmpty(Queue *que){
return que->size == 0;
}
void push(Queue *que,int data){
if(que->size == que->cap){
que->m_vect = realloc(que->m_vect,sizeof(int)*(que->cap+4));
que->cap = que->cap+4;
}
que->m_vect[que->size++] = data;
}
int pop(Queue *que){
--que->size;
return que->m_vect[que->index++];
}
void reset(Queue *que){
que->size = 0;
que->index = 0;
}
void baseSort(int arr[],size_t len){
int max = arr[0];
for(int i=0;i<len;i++){
if(max < arr[i]){
max = arr[i];
}
}
int cnt = 0;
while(max != 0){
cnt++;
max = max/10;
}
Queue qs[10];
for(int i=0;i<10;i++){
init(&qs[i],4);
}
for(int i=0;i<cnt;i++){
for(int k=0;k<len;k++){
int n = arr[k];
for(int j=0;j<i;j++){
n = n/10;
}
push(&qs[n%10],arr[k]);
}
int m = 0;
for(int j=0;j<10;j++){
while(!isEmpty(&qs[j])){
arr[m++] = pop(&qs[j]);
}
reset(&qs[j]);
}
}
for(int i=0;i<10;i++){
destroy(&qs[i]);
}
}
int main(){
int arr[] = {117,38,5678,4231,998,328,91,34,27,56,23,64,28,19,77,35,48,4,17,95,83,25,58};
size_t len = sizeof(arr)/sizeof(arr[0]);
baseSort(arr,len);
//countSort(arr,len);
//quickSort(arr,len);
//mergerSort(arr,len);
//heapSort(arr,len);
//bubbleSort(arr,len);
//selectSort(arr,len);
//cookSort(arr,len);
//insertSort(arr,len);
//binSort(arr,len);
//shellSort(arr,len);
printArr(arr,len);
return 0;
}