![]() |
#2
xg56992011-08-22 11:42
是错在希尔排序这里,只不过我不懂希尔排序,给你个编译通过的程序,希望对你有提示帮助
![]() #include <iostream> #include <time.h> #include <stdlib.h> using namespace std; const int len = 15; int switch_num = 0; int* CreateArray(int n) { int* p = new int[n]; *(p+0) = 26; *(p+1) = 78; *(p+2) = 39; *(p+3) = 60; *(p+4) = 30; *(p+5) = 87; *(p+6) = 30; *(p+7) = 57; *(p+8) = 55; *(p+9) = 6; *(p+10) = 41; *(p+11) = 19; *(p+12) = 62; *(p+13) = 49; *(p+14) = 40; return p; } int* CreateRandomArray(int n) { srand(time(NULL)); int* p = new int[n]; for (int i = 0; i < n; ++i) { p[i] = rand() % 100; } return p; } int* CopyArray(int *p, int n) { int i; int* pArr = new int[n]; for (i = 0; i < n; ++i) { pArr[i] = p[i]; } return pArr; } void PrintArray(int* p, int n) { int i; for (i = 0; i < n; ++i) { cout << p << " "; } cout << endl; } void Switch(int& a, int& b) { a = a ^ b; b = a ^ b; a = a ^ b; } ////////////////////////////////////////////////////////////////////// //希尔排序 void ShellSort(int* p, int n) { int i, j, k; for (int gap = n / 2; gap > 0; gap = gap / 2) { for (k = 0; k < gap; ++k) { for (i = k + gap; i < n; i += gap) { for (j = i; j > 0; j -= gap) { if (p[j] < p[j-gap]) { Switch(p[j], p[j-gap]); ++switch_num; } else //另外直接去掉else也能通过,给我的感觉就是数组越界,就是将[15]的这个数组赋值了,导致在delete释放过程中遇到heap corruption问题 /* 举个例子来说就是 // #include <iostream> using namespace std; void main() { int *a=new int[2]; a[2]=5; delete []a; } 输出就是和你一模一样的错误 */ { break; } } } break; //增加break就能通过,只不过结果不是与你的程序相符. } PrintArray(p, n); } } ////////////////////////////////////////////////////////////////////// int main() { cout << "Hello world!" << endl; srand(time(NULL)); int* pArr; cout << "before sort: " << endl; pArr = CreateArray(len); //pArr = CreateRandomArray(len); PrintArray(pArr, len); cout << endl << endl; switch_num = 0; int* pArrShell = CopyArray(pArr,len); ShellSort(pArrShell, len); cout << "after shell sort:" << endl; PrintArray(pArrShell, len); cout << "switch number is: " << switch_num << endl << endl; delete []pArrShell; delete []pArr; return 0; } [ 本帖最后由 xg5699 于 2011-8-22 11:58 编辑 ] |
程序源代码如下:

#include <iostream>
#include <time.h>
#include <stdlib.h>
using namespace std;
const int len = 15;
int switch_num = 0;
int* CreateArray(int n)
{
int* p = new int[n];
*(p+0) = 26;
*(p+1) = 78;
*(p+2) = 39;
*(p+3) = 60;
*(p+4) = 30;
*(p+5) = 87;
*(p+6) = 30;
*(p+7) = 57;
*(p+8) = 55;
*(p+9) = 6;
*(p+10) = 41;
*(p+11) = 19;
*(p+12) = 62;
*(p+13) = 49;
*(p+14) = 40;
return p;
}
int* CreateRandomArray(int n)
{
srand(time(NULL));
int* p = new int[n];
for (int i = 0; i < n; ++i)
{
p[i] = rand() % 100;
}
return p;
}
int* CopyArray(int* p, int n)
{
int i;
int* pArr = new int[n];
for (i = 0; i < n; ++i)
{
pArr[i] = p[i];
}
return pArr;
}
void PrintArray(int* p, int n)
{
int i;
for (i = 0; i < n; ++i)
{
cout << p << " ";
}
cout << endl;
}
void Switch(int& a, int& b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
//////////////////////////////////////////////////////////////////////
//希尔排序
void ShellSort(int* p, int n)
{
int i, j, k;
for (int gap = n / 2; gap > 0; gap = gap / 2)
{
for (k = 0; k < gap; ++k)
{
for (i = k + gap; i < n; i += gap)
{
for (j = i; j > 0; j -= gap)
{
if (p[j] < p[j-gap])
{
Switch(p[j], p[j-gap]);
++switch_num;
}
else
{
break;
}
}
}
}
PrintArray(p, n);
}
}
//////////////////////////////////////////////////////////////////////
int main()
{
cout << "Hello world!" << endl;
srand(time(NULL));
int* pArr;
cout << "before sort: " << endl;
pArr = CreateArray(len);
//pArr = CreateRandomArray(len);
PrintArray(pArr, len);
cout << endl << endl;
switch_num = 0;
int* pArrShell = CopyArray(pArr, len);
ShellSort(pArrShell, len);
cout << "after shell sort:" << endl;
PrintArray(pArrShell, len);
cout << "switch number is: " << switch_num << endl << endl;
delete[] pArrShell; //就是在这个位置出错的
delete[] pArr;
return 0;
}
[ 本帖最后由 flashboy84 于 2011-8-22 00:52 编辑 ]