У меня есть функция, которую я написал ниже. Эта функция по существу является сортировкой слияния.Какова большая сложность этого алгоритма?
public static long nlgn(double[] nums) {
if(nums.length > 1) {
int elementsInA1 = nums.length/2;
int elementsInA2 = nums.length - elementsInA1;
double[] arr1 = new double[elementsInA1];
double[] arr2 = new double[elementsInA2];
for(int i = 0; i < elementsInA1; i++)
arr1[i] = nums[i];
for(int i = elementsInA1; i < elementsInA1 + elementsInA2; i++)
arr2[i - elementsInA1] = nums[i];
nlgn(arr1);
nlgn(arr2);
int i = 0, j = 0, k = 0;
while(arr1.length != j && arr2.length != k) {
if(arr1[j] <= arr2[k]) {
nums[i] = arr1[j];
i++;
j++;
} else {
nums[i] = arr2[k];
i++;
k++;
}
}
while(arr1.length != j) {
nums[i] = arr1[j];
i++;
j++;
}
while(arr2.length != k) {
nums[i] = arr2[k];
i++;
k++;
}
}
return nuts;
}
Поскольку это сортировка слиянием, я знаю из моих исследований, что сложность большой-O этого алгоритма O (п ЛГН). Однако, когда я запускаю свои тесты времени, полученные результаты не предполагают, что это работает в O (n lgn) времени. Кажется, что это O (n lgn) время, хотя, потому что до тех пор, пока мы не дойдем до конца двух циклов в начале. он работает в O (n) времени. После этого он должен работать в O (lgn), поскольку он сортирует каждый элемент.
Мой вопрос: может ли кто-нибудь подтвердить, что этот кусок кода работает в O (n lgn) раз? Если нет, я хотел бы знать, где я ошибаюсь в своем понимании.
Reaaally аналогичный вопрос к http://stackoverflow.com/questions/33716270/how-do-these -Результаты-доказательства-мой-метод-это-обкатка-на-ЛГНО время. – orlp
Если проблема решена, пожалуйста, не забудьте принять! – Tipton
Какие результаты _did_ вы получаете, и как они предлагают, кроме 'O (n lgn)'? (Игнорируйте любые результаты за второй квартал, увеличивайте размер проблемы.) Если 'O (lgn) time' не является типизирующей ошибкой, не могли бы вы возразить в пользу этого результата? – greybeard