/********************************************************************************************************
*
* file name: Zqh_計數排序.c
* author : keyword2024@163.com
* date : 2024/05/05
* function : 計數排序.改
* note : 演算法
*
* Copyright (c) 2023-2024 keyword2024@163.com All right Reserved
* ******************************************************************************************************/
#include<stdio.h>
/*
第一種形式實現計數排序
計數排序後的順序為從小到大
arr[0...len-1]為待排陣列,每個元素均是0-k中的一個值
brr[0...len-1]為排序後的輸出陣列
crr[0...k]儲存0...k中每個值在陣列arr中出現的次數
*/
void Count_Sort(int *arr,int *brr,int *crr,int len,int k)
{
int i,j=0;
//陣列crr各元素置0
for(i=0;i<=k;i++)
crr[i] = 0;
//統計陣列arr中每個元素重複出現的個數
for(i=0;i<len;i++)
crr[arr[i]]++;
//求陣列arr中小於等於i的元素個數
for(i=1;i<=k;i++)
crr[i] += crr[i-1];
//把arr中的元素放在brr中對應的位置上
for(i=len-1;i>=0;i--)
{
brr[crr[arr[i]]-1] = arr[i];
//如果有相同的元素,則放在下一個位置上
crr[arr[i]]--;
}
}
/*
第二種形式實現計數排序
計數排序後的順序為從小到大
arr[0...len-1]為待排陣列,每個元素均是0-k中的一個值
crr[0...k]儲存0...k中每個值在陣列arr中出現的次數
*/
void Count_Sort(int *arr,int *crr,int len,int k)
{
int i,j=0;
//陣列crr各元素置0
for(i=0;i<=k;i++)
crr[i] = 0;
//統計陣列arr中每個元素重複出現的個數
for(i=0;i<len;i++)
crr[arr[i]]++;
//根據crr[i]的大小,將元素i放入arr適當的位置
for(i=0;i<=k;i++)
while((crr[i]--)>0)
{
arr[j++] = i;
}
}
int main()
{
int i;
//待排序陣列,每個元素均在0-8之間
int arr[] = {2,1,3,8,6,0};
int brr[6];
int crr[9];
Count_Sort(arr,brr,crr,6,8);
printf("計數排序後的結果為:");
for(i=0;i<6;i++)
printf("%d ",brr[i]);
printf("\n");
return 0;
}