计数排序及其C语言实现

计数排序及其C语言实现

  • 1 计数排序的背景
  • 2 代码
    • 2.1 实现方法1
    • 2.2 实现方法2
  • 3 测试例程
    • 3.1 测试数据
    • 3.2 测试主程序
    • 3.3 输出数组和表
    • 3.4 测试结果

1 计数排序的背景

数组的特点:

  • (1)特别容易索引,a[i] 就可以找到i所对应的元素!
  • (2)数组的索引,本身就是升序的

那么我们对正整数进行排序的时候,能不能建立一个很大的数组呢?数组中的元素代表正整数出现的次数!

计数排序及其C语言实现_第1张图片

2 代码

2.1 实现方法1

在table中记录待排序数组中每个元素出现次数:

void recordTimes(int *arr, int lenOfArr, int *table)
{
     
    for(int i = 0; i < lenOfArr; i++){
     
        table[arr[i]]++;
    }
}

输出排序后的数组:

void outNotZeroIndex(int *table, int lenOfTable, int *sortedArr)
{
     
    int k = 0;
    for(int i = 0; i < lenOfTable; i++){
      // Index of table
        for(int j = 0; j < table[i]; j++){
     
            sortedArr[k++] = i; // Output the index of table
        }
    }
}

2.2 实现方法2

计数排序及其C语言实现_第2张图片

void CountingSorted(int *arr, int *table, int *sortedArr, int lenOfTable, int lenOfArr)
{
     
    for(int i = 0; i < lenOfTable; i++){
      // Clear the Counter
        table[i] = 0;
    }

    for(int i = 0; i < lenOfArr; i++){
       // Index of table
        table[arr[i]]++;
    }

    printf("table is: \r\n");
    print_table(table, lenOfTable);

    for(int i = 0; i < lenOfTable - 1; i++){
      // Accumulation of times
        table[i+1] = table[i+1] + table[i];
    }

    printf("table is: \r\n");
    print_table(table, lenOfTable);

    for(int i = 0; i < lenOfArr; i++){
       // Output the index of table
        sortedArr[table[arr[i]] - 1] = arr[i];
        table[arr[i]]--;
    }
}

3 测试例程

3.1 测试数据

int arr[] = {
     2, 1, 5, 9, 6, 1, 7, 9, 0, 5, 4, 5, 1, 2, 0, 5};

int table[10] = {
     0};

3.2 测试主程序

int main(int argc, char *argv[])
{
     
    int SortedOut[sizeof(arr)/sizeof(int)] = {
     0};

    printf("Waiting array is:\r\n");
    print_intArray(arr, sizeof(arr)/sizeof(int));
    printf("Table is : \r\n");
    print_table(table, sizeof(table)/sizeof(int));

    recordTimes(arr, sizeof(arr)/sizeof(int), table);
    
    printf("After counting, table is : \r\n");
    print_table(table, sizeof(table)/sizeof(int));

    printf("Sorted array is : \r\n");
    outNotZeroIndex(table, sizeof(table)/sizeof(int), SortedOut);
    print_intArray(SortedOut, sizeof(SortedOut)/sizeof(int));

    return 0;
}

3.3 输出数组和表

输出整型数组

void print_table(int *arr, int len)
{
     
    int i;

    printf("=============================================\r\n");
    for(i = 0; i < len; i++){
     
        printf("|%-5d", i);
        if((i+1) % 10 == 0){
     
            printf("|\r\n");
        }
    }
    if(i % 10 != 0){
     
        printf("|\r\n");
    }
    printf("---------------------------------------------\r\n");
    for(i = 0; i < len; i++){
     
        printf("|%-5d", arr[i]);
        if((i+1) % 10 == 0){
     
            printf("|\r\n");
        }
    }
    if(i % 10 != 0){
     
        printf("|\r\n");
    }
    printf("=============================================\r\n");
}

输出辅助排序的表table

void print_intArray(int *arr, int len)
{
     
    int i;
    for(i = 0; i < len; i++){
     
        printf("|%-5d", arr[i]);
        if((i+1) % 10 == 0){
     
            printf("|\r\n");
        }
    }

    if(i % 10 != 0){
     
        printf("|\r\n");
    }
}

3.4 测试结果

计数排序及其C语言实现_第3张图片

你可能感兴趣的:(c语言,开发语言,后端,排序算法)