why is in place merge sort not stable?

偶尔善良 提交于 2019-11-30 16:12:34

Because the <= in your code assures that same-valued elements (in left- and right-half of sorting array) won't be exchanged. And also, it avoids useless exchanges.

if (a[lo] <= a[start_hi]) {
 /* The left value is smaller than or equal to the right one, leave them as is. */
 /* Especially, if the values are same, they won't be exchanged. */
 lo++;
} else {
 /*
  * If the value in right-half is greater than that in left-half,
  * insert the right one into just before the left one, i.e., they're exchanged.
  */
 ...
}

Assume that same-valued element (e.g., ‘5’) in both-halves and the operator above is <. As comments above shows, the right ‘5’ will be inserted before the left ‘5’, in other words, same-valued elements will be exchanged. This means the sort is not stable. And also, it's inefficient to exchange same-valued elements.


I guess the cause of inefficiency comes from the algorithm itself. Your merging stage is implemented using insertion sort (as you know, it's O(n^2)).

You may have to re-implement when you sort huge arrays.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!