瞭解了排序之後,便可以對資料進行統計。 有些統計需要應用到排序,例如中位數,可以在排序好之後,直接取出中間的數字:

#include <stdio.h>

#define SIZE 10

void insertionSort(int a[], int size){
    int i, j, temp;

    for(i=1;i<size;i++){
        temp = a[i];
        j = i - 1;
        while(j>=0 && a[j]>temp){
            a[j+1] = a[j];
            j--;
        }
        a[j+1] = temp;
    }
}

double median(int a[], int size){
	if(size%2==1){ /* odd size */
		return a[size/2];
	}
	else{ /* even size */
		return (a[size/2-1]+a[size/2])/2.0;
	}
}

int main()
{
	int i, a[SIZE] = {3,0,1,8,7,2,5,4,6,9};
	double m;

	insertionSort(a, SIZE);
	m = median(a, SIZE);
	printf("Median: %f\n", m);

	return 0;
}

若要尋找眾數,則因為排序好之後,同樣的數字會被排在一起, 所以循序計數過一遍,就可以知道每個數字出現的次數:

#include <stdio.h>

#define SIZE 10

void insertionSort(int a[], int size){
    int i, j, temp;

    for(i=1;i<size;i++){
        temp = a[i];
        j = i - 1;
        while(j>=0 && a[j]>temp){
            a[j+1] = a[j];
            j--;
        }
        a[j+1] = temp;
    }
}

int mode(int a[], int size){
	int i;
	int modeValue=a[0], modeCount=1, thisCount=1; /* 第一個數字出現一次 */
	for(i=1;i<size;i++){
		if(a[i]==a[i-1]){ /* 數字沒變,繼續加 */
			thisCount++;
		}
		else { /* 數字改變,處理計數結果 */
			printf("value: %d, count: %d\n", a[i-1], thisCount);
			if(thisCount>modeCount){
				modeCount = thisCount;
				modeValue = a[i-1];
			}
			thisCount = 1;
		}
	}
	/* 處理最後一個數字 */
	printf("value: %d, count: %d\n", a[i-1], thisCount);
	if(thisCount>modeCount){
		modeCount = thisCount;
		modeValue = a[i-1];
	}
	return modeValue;
}

int main()
{
	int a[SIZE] = {3,3,1,1,1,85,445,445,999,0};
	int m;

	insertionSort(a, SIZE);
	m = mode(a, SIZE);

	printf("mode value: %d\n", m);

	return 0;
}

但如果你已經事先知道數字的範圍,並且範圍不大,則可以直接使用陣列來計數。 以下範例會亂數產生 100 個介於 1~10 之間的數字,並計算眾數:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZE 11
#define RANDNUM 100

int mode(int a[], int size){
	int occTimes, theMode;
	int i;

	occTimes = a[1];
	theMode = 1;
	for(i=2;i<size;i++){
		if(a[i]>occTimes){
			occTimes = a[i];
			theMode = i;
		}
	}
	return theMode;
}

int main()
{
	int i;
	int array[RANDNUM] = {0};
	int count[SIZE] = {0};

	/* 亂數產生數字 */
	srand( time(NULL) );
	for(i=0;i<RANDNUM;i++){
		array[i] = 1+rand()%10;
	}
	
	/* 計算每個數字各出現幾次 */
	for(i=0;i<RANDNUM;i++){
		count[ array[i] ] += 1;
	}

	printf("Histogram:\n");
	for(i=1;i<SIZE;i++){
		printf("%2d: %2d times\n", i, count[i]);
	}

	printf("Mode: %d\n", mode(count, SIZE));

	return 0;
}