我试图实现CLRS第3版中给出的合并排序算法。 我没有使用sentinel值,而是检查了合并操作中的边界。
以下是我的合并排序实现
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
void merge(int [],int p,int q ,int r);
void mergeSort(int [],int p,int r);
int main(int argc, char** argv)
{
int input[10];
for(int i = 0 ; i < 10 ; i++){
input[i] = (rand()%100)+10;
}
mergeSort(input,0,9);
cout<<endl;
for(int i = 0 ;i <10; i++){
cout<<input[i]<<"\t";
}
cout<<endl;
return 0;
}
void mergeSort(int input[],int lower, int higher)
{
if(lower<higher){
int mid = (lower + higher)/2;
mergeSort(input,lower,mid);
mergeSort(input,mid+1,higher);
merge(input,lower,mid,higher);
}
}
void merge(int input[], int lower, int mid , int higher)
{
int sizeLeft = mid - lower +1;
int sizeRight = higher - mid;
int *leftArray = new int(sizeLeft);
int *rightArray = new int(sizeRight);
for(int i = 0 ; i < sizeLeft ; i++){
leftArray[i] = input[i+lower];
}
for(int j = 0 ; j < sizeRight ; j++){
rightArray[j] = input[mid+j+1];
}
int i = 0 ;
int j =0;
for (int k = lower ; k <= higher ; k++){
if(leftArray[i]<=rightArray[j] || j>higher){
input[k]= leftArray[i];
i = i + 1;
}else if(rightArray[j]< leftArray[i] || i>mid){
input[k] = rightArray[j];
j = j+1;
}
}
}
我为程序的每次运行获得以下输出
25 0 0 31 0 0 45 0 87 0
基本上我随机生成10个数字并将它们复制到数组中,然后使用合并排序对数组进行排序。
请帮帮我。提前谢谢。
--EDIT--
我在完成调试器后做了以下更改,得到了正确的答案。 在合并操作中,我将其更改为:
void merge(int input[], int lower, int mid , int higher)
{
int sizeLeft = mid - lower +1;
int sizeRight = higher - mid;
int *leftArray = new int[sizeLeft];
int *rightArray = new int[sizeRight];
for(int i = 0 ; i < sizeLeft ; i++){
leftArray[i] = input[i+lower];
}
for(int j = 0 ; j < sizeRight ; j++){
rightArray[j] = input[mid+j+1];
}
int i = 0 ;
int j =0;
for (int k = lower ; k <= higher ; k++){
if((i+lower)>mid){
input[k]= rightArray[j++];
}else if((j+mid+1)>higher){
input[k] = leftArray[i++];
}else if(leftArray[i]<= rightArray[j]){
input[k] = leftArray[i++];
}else{
input[k] = rightArray[j++];
}
}
delete [] leftArray;
delete [] rightArray;
}
答案 0 :(得分:3)
您的算法可能有问题但突出的是内存处理错误。
当你说:
int *leftArray = new int(sizeLeft);
您为单 int
分配内存,并使用sizeLeft
的值对其进行初始化。这显然不是你想要的。如果您想为int
的数组分配内存,您应该说:
int *leftArray = new int[sizeLeft];
注意方括号而不是括号。
在函数返回之前,您也不会释放内存,因此每次调用时都会泄漏内存。要释放你需要做的记忆:
delete [] leftArray;
话虽如此,这是C ++,有更好的方法可以拥有动态数组,例如std::vector
。