为什么合并排序不稳定?

下面的实现是稳定的,因为它使用<=而不是<在标记为XXX的行。 这也使它更有效率。 有没有理由在这一行使用<而不是<=

 /** class for In place MergeSort **/ class MergeSortAlgorithm extends SortAlgorithm { void sort(int a[], int lo0, int hi0) throws Exception { int lo = lo0; int hi = hi0; pause(lo, hi); if (lo >= hi) { return; } int mid = (lo + hi) / 2; /* * Partition the list into two lists and sort them recursively */ sort(a, lo, mid); sort(a, mid + 1, hi); /* * Merge the two sorted lists */ int end_lo = mid; int start_hi = mid + 1; while ((lo <= end_lo) && (start_hi <= hi)) { pause(lo); if (stopRequested) { return; } if (a[lo] = a[start_hi] * The next element comes from the second list, * move the a[start_hi] element into the next * position and shuffle all the other elements up. */ int T = a[start_hi]; for (int k = start_hi - 1; k >= lo; k--) { a[k+1] = a[k]; pause(lo); } a[lo] = T; lo++; end_lo++; start_hi++; } } } void sort(int a[]) throws Exception { sort(a, 0, a.length-1); } } 

因为代码中的<=确保不会交换相同值的元素(在排序数组的左半部分和右半部分)。 而且,它避免了无用的交流。

 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, ie, they're exchanged. */ ... } 

假设两半和上面的运算符中的相同值元素(例如,'5')是< 。 如上面的评论所示,右边的'5'将插入左'5'之前,换句话说,将交换相同值的元素。 这意味着排序不稳定。 而且,交换同值元素也是低效的。


我认为效率低下的原因来自算法本身。 您的合并阶段是使用插入排序实现的(如您所知,它是O(n ^ 2))。

在对大型数组进行排序时,可能需要重新实现。