Вот самый быстрый способ решить проблему в Windows.
Рядом с исполняемым файлом создайте файл qt.conf (если он еще не существует) и добавьте следующее:
[Platforms]
WindowsArguments = dpiawareness=0
При увеличении масштаба окно будет размыто. Большим преимуществом этого решения является то, что Windows делает масштабирование, а не Qt. Поэтому наличие артефактов минимизировано. Кроме того, это может относиться к уже распределенному приложению, так как оно не требует перестройки.
Конечно, это не самый приятный результат, но самый быстрый способ избавить вас от неприятностей в краткосрочной перспективе, позволяя вы разрабатываете «настоящую» версию с поддержкой DPI без давления.
Я попытался запустить твой код. Это бежало отлично. Вот вывод на консоль.
How many numbers would you like to generate?
(More Numbers = Longer Sort): 17
[303, 394, 315, 436, 196, 212, 629, 139, 666, 519, 4, 182, 36, 108, 129, 490, 174]
[4, 36, 108, 129, 139, 174, 182, 196, 212, 303, 315, 394, 436, 490, 519, 629, 666]
Нет исключений:)
Это не имеет ничего общего с получением информации с консоли. Вместо этого в вашем коде есть ошибка.
int mid = left_start + curr_size - 1;
int right_end = Math.min(left_start + 2*curr_size - 1, n-1);
Рассмотрим выше, чтобы линии. Всякий раз, когда left_start + 2*curr_size - 1
достаточно больше, чем n-1
, значение right_end
становится меньше, чем mid
.
В этом случае значение n2
в методе merge () становится отрицательным. Отсюда и ошибка. Как только вы исправите это, вы решите проблему.
ОБНОВЛЕНИЕ Я добавил несколько if
условий. Вот рабочий код.
public static void mergeSort(int arr[])
{
int n = arr.length;
// For current size of subarrays to
// be merged curr_size varies from
// 1 to n/2
int curr_size;
// For picking starting index of
// left subarray to be merged
int left_start;
// Merge subarrays in bottom up
// manner. First merge subarrays
// of size 1 to create sorted
// subarrays of size 2, then merge
// subarrays of size 2 to create
// sorted subarrays of size 4, and
// so on.
for (curr_size = 1; curr_size <= n-1;
curr_size = 2*curr_size)
{
// Pick starting point of different
// subarrays of current size
for (left_start = 0; left_start < n-1;
left_start += 2*curr_size)
{
// Find ending point of left
// subarray. mid+1 is starting
// point of right
int mid = left_start + curr_size - 1;
int right_end = Math.min(left_start
+ 2*curr_size - 1, n-1);
if(right_end<mid)
right_end=mid;
// Merge Subarrays arr[left_start...mid]
// & arr[mid+1...right_end]
merge(arr, left_start, mid, right_end);
}
}
}
public static void merge(int arr[], int l, int m, int r)
{
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
/* create temp arrays */
int L[] = new int[n1];
int R[] = new int[n2];
/* Copy data to temp arrays L[]
and R[] */
for (i = 0; i < n1; i++)
if(l+i<arr.length)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
if(l+j<arr.length)
R[j] = arr[m + 1+ j];
/* Merge the temp arrays back into
arr[l..r]*/
i = 0;
j = 0;
k = l;
while (i < n1 && j < n2)
{
if (L[i] <= R[j])
{
arr[k] = L[i];
i++;
}
else
{
arr[k] = R[j];
j++;
}
k++;
}
/* Copy the remaining elements of
L[], if there are any */
while (i < n1 && i<n1 && k<arr.length)
{
arr[k] = L[i];
i++;
k++;
}
/* Copy the remaining elements of
R[], if there are any */
while (j < n2)
{
arr[k] = R[j];
j++;
k++;
}
}
Я чувствую, что вы можете упростить код, хотя.