Сложность алгоритма сортировки пузырьков O (n ^ 2). Даже при использовании if (swapped == false) break;
это не поможет уменьшить сложность (попробуйте {2,3,4,5,1}, вы узнаете).
Поскольку существует такой индекс i(0 < i < N-1)
, что подстрока A[0],...,A[i]
сортируется по возрастанию, а также подрешетка A[i+1],...,A[N]
сортируется по возрастанию. Эту проблему можно решить в O (n) сложности времени выполнения. Если нам удастся найти индекс i
, где A[0:i] and A[i+1:n] are sorted
, то эту проблему можно представить как объединение двух отсортированных массивов в один массив, что можно сделать за O (n) раз. Алгоритм приведен ниже:
void sortPartialSortedArray(int arr[], int n)
{
int pos = 0;
// find the position for which arr[0:pos] and arr[pos+1:n] is sorted
for(int i=0; i+1<n; i++) {
if(arr[i]>arr[i+1]) {
pos = i;
}
}
int i = pos, j= n-1;
// sort it from last position
while(i>=0 && j>=0) {
if(arr[i] > arr[j]) {
swap(arr[i],arr[j]);
}
j--;
if(i==j) {
i--;
}
}
}