有序序列中的i个最大数
(算法导论思考题9-1)
a
时间复杂度O(nlgn+i)
//总共时间复杂度O(nlgn+i)
vector<int> i_largest_number_in_ordered_sequence_a(int *array,int length,int i){vector<int>result;//时间复杂度O(nlgn)quick_sort_by_median_contains_equal_elements(array,0,length-1);//时间复杂度iwhile (i>0){result.push_back(array[length-i]);i--;}return result;
}
b 时间复杂度O(n+ilgn)
//时间复杂度O(n+ilgn)
vector<int> i_largest_number_in_ordered_sequence_b(int *array,int length,int i){vector<int>result;//时间复杂度O(n)build_heap(array,length);int heap_size = length;//时间复杂度O(ilgn)while (i-->0){//O(lgn)result.push_back(extra_max(array,heap_size));}return result;
}
c 时间复杂度O(n+ilgi)
//时间复杂度O(n+ilgi)
vector<int> i_largest_number_in_ordered_sequence_c(int *array,int length,int i)
{vector<int> result;//时间复杂度O(n)int key = select(array,0,length - 1,length - i + 1);//时间复杂度O(n)int position = partition(array,0,length - 1,key);//时间复杂度O(ilgi)quick_sort_by_median_contains_equal_elements(array,position,length - 1 );//时间复杂度O(i)for(int j = position;j < length;j++){result.push_back(array[j]);}return result;
}
综上比较 c是最佳渐进最坏情况运行时间最优的算法。
辅助函数 extra_max
int extra_max(int *array,int& heap_size)
{int max = array[0];array[0] = array[heap_size-1];heap_size -- ;max_heapify(array,heap_size,0);return max;
}
辅助函数 max_heapify
链接地址
辅助函数
quick_sort_by_median_contains_equal_elements
地址链接
select和partition
链接地址