Last updated
Was this helpful?
Last updated
Was this helpful?
time: O(nlogn)
space: O(n)
้้ก่ช็ๅป็ๅฏไปฅ็ผ็พ, ๅ ถๅฏฆไธป้ซๅฐฑๆฏ mergeSort, ไฝ็บไป้บผๅฏไปฅๅจ mergeSort ็้็จไธญ
้ๆ count ๅณ้ๆฏๆฌ่บซๅฐ็็ตๆๅข๏ผ
ไธป่ฆๆฏ่ฆๅ ๅฉ็จไธๅ Item class, ไพ่จ้ๅๆฌ็ๅผๅ index
้ๆๅฉ็จไธๅ count ้ฃๅ, ไพ่จ้ๆๅพ็็ญๆก, ๆ้บผ็ด้็ญๆกๅข๏ผ
ๅฐฑๆฏๅฉ็จ Item class ่ฃก้ขๅๆฌ็ๅผๅ index
merge 5, 2
1.
if (items[l].val > items[r].val) =>
a. ไปฃ่กจ็ฎๅๆฏ้ๅบ(ๅทฆ้ ๅคงๆผ ๅณ้), ๆไปฅ่ฆ ๅณ้ ่ฆ็งปๅฐ ๅทฆ้, ๆๆๆฏ sorted, ไปฅ้ไพ่ชชๅฐฑๆฏ item[r++] ๅ ๅฐ temp
b. ไฝ้ๅบไนไปฃ่กจไบไธไปถไบ => ๅณ้ๆไธๅๆธๅคงๆผๅทฆ้, ๆไปฅ rightCount++
else ไนๅฐฑๆฏ sorted, ้ฃ่ฆๅไป้บผๅข๏ผ ๅฐฑๆฏ่ฆ่จ้็ตๆๅฐ count[] ้ฃๅ, ๅ ็บๅทฒ็ถๆฒๆๅณ้ๆฏๅทฆ้ๅคง็ case ไบ
a. ่จ้็ตๆๅฐ count[] ้ฃๅ .=> ้ๅฐฑ่ฆๅฉ็จๅฐ items[l].idx ไบ so count[items[l.idx]] += rightCount
b. ๆ l ็ฎๅๅ งๅฎนๅ ๅ ฅ, item[l++] ๅ ๅฐ temp
ex 5, 2 .=> 2, 5 ., rightCount++, ๅกไบ 2 ๅฐ temp[0]
็ฌฌไบๅ while ๅฐฑ่ท ็ฌฌไธๅ while else ๅ ถๅฏฆๅ งๅฎนไธๆจฃ ๏ผ ๅ ็บๆฏ l <= mid)
ex 5 2 .=> 2, 5 ไนๅพ, ้ๅฉไธ 5, ๆไปฅๅก 5 ๅฐ temp[1] .( while l <= mid
5 ็ count+= rightCount, ไนๅฐฑๆฏ count[0] += 1
ex 2 .5 merge 1 ๆ =>
lowPtr . | hiPtr
2 . 5 . 1
=> ็ถๆญทไนๅ็ฌฌไธๅ while ๅพ => 1 2 5 .=> rightCount = 1
lowPtr . mid hiPtr
2 . 5 . 1
while (l <= mid ) .=> ๆไปฅ 2, 5 (count[1], count[0])้ฝ่ฆ += rightCount (ๅ ็บๆๅๅฐ็1 ๅฐๅทฆ้ๅฆ
ๆๅพๆ temp ็ตๆ(sort ็๏ผ, ๆดๆฐๅฐๅๆฌ items ไธญ