algorithm - Counting the number of moves for sorting an array if only unit shift are allowed -
so, have array containing integers. need sort it. however, operation can perform unit shift. is, can move last element of sequence beginning.
`a1, a2, ..., an → an, a1, a2, ..., an - 1.` what minimum number of operations need sort sequence?
the number of integers in array can upto 10^5. , each integer individual value can 10^5 too. also, if array sorted, print 0 else if array cannot sorted unit shifts, print -1.
the solution thought of:
- check if array sorted or not.
- if array sorted, print 0 else
- set count = 0
- rotate array 1 unit , increment count.
- check if array sorted: if yes, print count , break, else
- repeat steps 4-5 till count < (total integers in array).
now, above solution has time complexity of o(n^2). because, checking each individual element if array sorted , checking takes o(n) time, , have n elements, makes o(n^2).
can suggest me other better approach? thanks!
ps: tried hard thinking of other approach. reached uptill counting inversions, doesn't help.
just iterate array, find first index i such arr[i] > arr[i+1] (if there no such index, done since array sorted), check if arr[i+1],...,arr[n] sorted, , if arr[n] <= arr[1]. if is, can done doing n-i rotations.
otherwise, there no solution.
time complexity o(n), space complexity o(1).
appendix: correctness of algorithm:
claim 1:
if array cannot splitted 2 arrays
arr[1],arr[2],..,arr[i],arr[i+1],...,arr[n]- both sorted, there no solution.
proof:
let's assume i first index arr[i] > arr[i+1], , let j other index such arr[j] > arr[j+1], j!=i. there must such because arr[i+1],...,arr[n] unsorted.
by definition, while j+1 not "unit shifted", array unsorted.
immidiately after shifted, still not sorted since arr[i] > arr[i+1], , after shift, arr[j] again before arr[j+1], , violating sorted order.
thus, array cannot sorted.
claim 2:
assume array can splitted 2 sorted array
arr[1],...,arr[i], ,arr[i+1],...,arr[n].
also assumearr[i] > arr[i+1].
then, array can "unit shifted" sorted one, if , ifarr[n] <= arr[1].
proof:
<---
the array not sorted, @ least 1 unit shift must done. unit shift places arr[n] before arr[1], , array never sorted unless arr[n]<=arr[1]
--->
assume arr[n]<=arr[1], shifting arr[i+1],...,arr[n], following array:
arr[i+1],arr[i+2],...,arr[n],arr[1],arr[2],...,arr[i] note arr[i+1]<= arr[i+2] <= .... <= arr[n] since assumed sorted.
similarly arr[1]<=arr[2]<=...<=arr[i]
also note arr[n] <= arr[i], assumption.
by joining 3 above inequalities get:
arr[i+1] <= arr[i+2] <= ... <= arr[n] m= arr[1] <= arr[2] <= ... <= arr[i] the above definition sorted array, concludes proof claim.
claim 3:
the algorithm correct
by applying claim1,claim2 , handling case array sorted, that:
the array can sorted using "unit shifts" if , if: sorted, or conditions of claim2 applies, , concludes proof.
qed
Comments
Post a Comment