int a[] = {12,13,12,13,19,18,15,12,15,16,17},要求对数组a进行排序,要求时间复杂度为O(N) 根据时间复杂度要求,可以用鸽巢排序。所谓鸽巢排序, 也被称作基数分类, 是一种时间复杂度为(Θ(n))且在不可避免遍历每一个元素并且排序的情况下效率最好的一种排序算法. 但它只有在差值(或者可被映射在差值)很小的范围内的数值排序的情况下实用. 时间复杂度:O(N+n)(N :空间大小,n:元素大小) 空间复杂度:O(N) 算法分析: 1. 给定一个待排序 数组,创建一个备用数组(鸽巢),并初始化元素为0,备用数组的索引即是待排序数组的值。 2.把待排序数组的值出现的次数,放到“鸽巢”里(即用作备用数组的索引)。 3.把鸽巢里的值再依次送回待排序 数组。
void CountSort(int* array,int size) { int maxValue = array[0]; int minValue = array[0]; //找出最大元素和最小元素 for (int idx = 0; idx < size; idx++) { if (array[idx]>maxValue) maxValue = array[idx]; if (array[idx] < minValue) minValue = array[idx]; } int range = maxValue - minValue + 1; int* count = new int[range]; memset(count, 0, sizeof(int)*(range)); //统计相同元素出现的次数 for (int idx = 0; idx < size; idx++) { count[array[idx] - minValue]++; } //重新排序 int k = 0; for (int i = 0; i < range; i++) { for (int j = 0; j < count[i]; j++) { array[k] = minValue + i; k++; } } delete[] count; }