我在一个大数组中有4个排序部分。例如,大数组有100个项目,排序部分在索引上:0-24,25-49,50-74,75-99。
对整个阵列进行排序的最佳方法是什么?我真的更喜欢合并排序算法。
非常感谢您的一些想法。
答案 0 :(得分:3)
您不需要进行合并排序。您只需要进行3次合并操作(第1部分合并第2部分;第3部分合并第4部分;然后合并这两部分)。请注意,merge是一个O(n)操作,这使得合并排序工作。所以这个算法将是O(n)+ O(n)+ O(n)= O(n)。
O(n)是最佳的,因为无论如何,您都需要至少访问每个元素一次。 (所以问题,这个算法,也是Omega(n)和Theta(n),因为它的价值。)
答案 1 :(得分:2)
您需要使用std::inplace_merge
include
答案 2 :(得分:0)
您可以使用常规的自下而上合并,但由于您有4个已排序的组,每个有25个元素,因此将自下而上的合并排序运行大小(宽度)初始化为25.您可以按照wiki示例中的代码进行操作,但使用除外每次传递后std :: swap(A,B)而不是复制回传。由于100是n的倍数,因此您不需要最小化检查。
http://en.wikipedia.org/wiki/Merge_sort#Bottom-up_implementation
这样的事情:
#define n 100
// array A[] has the items to sort; array B[] is a work array
// in this case data ends up back in A[]
void BottomUpMergeSort(int A[], int B[], int n)
{
for (int width = 25; width < n; width = 2 * width){
for (int i = 0; i < n; i = i + 2 * width)
BottomUpMerge(A, i, i+width, i+2*width, B);
std::swap(A, B);
}
}
void BottomUpMerge(int A[], int iLeft, int iRight, int iEnd, int B[])
{
int i0 = iLeft;
int i1 = iRight;
int j;
for (j = iLeft; j < iEnd; j++){
if (i0 < iRight && (i1 >= iEnd || A[i0] <= A[i1]))
B[j] = A[i0++];
else
B[j] = A[i1++];
}
}