+ -
当前位置:首页 → 问答吧 → 关于C++快速排序,下边到底哪儿错了

关于C++快速排序,下边到底哪儿错了

时间:2011-12-17

来源:互联网

#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdlib.h>
#include <time.h>

#define MAXLOOPNUM 100000

/*结构体中的成员分别对应以上文档中说明的参数意义*/
typedef struct strArrayInfo
{
int K;
int N1,N2;
double *x; /*序列1*/
double *y; /*序列2*/
}ARRAYINFO;

using namespace std;

ARRAYINFO ReadArrayInfo(char *fname);
double CalcKthSmallestElem(ARRAYINFO info);
void swap(double *a, double *b);
int partition(double *array, int low, int high);
void quicksort(double *array, int low, int high);
void quick_sort(double *array, int size);/*函数声明*/

int main(int argc, char *argv[])
{
clock_t tm;
char *inFN, *outFN;
ofstream outfile;
ARRAYINFO info;
double result;
if (argc!=3)
{
cout<<"Usage: *.exe <input> <output>"<<endl;
return 0;
}
inFN = argv[1];
outFN = argv[2];
tm=clock();/* Start */
outfile.open(outFN);
if (!outfile.is_open())
{
cout<<"Cann't open file: "<<outFN<<endl;
}
info=ReadArrayInfo(inFN);
for (int n=0; n<MAXLOOPNUM; n++){
result = CalcKthSmallestElem(info); /*计算和序列中第K小的元素*/
}
/*free*/
if (info.x) free(info.x);
if (info.y) free(info.y);
tm=clock()-tm; /* End */
/* output result */
outfile <<setprecision(12) << result <<endl;
outfile <<"Time-Used:"<<tm<<"(ms)"<<endl;
outfile.close();
return 1;
}

/*
输入:输入文件名
输出:输入文件的相关信息,保存在结构体ARRAYINFO 中
*/
ARRAYINFO ReadArrayInfo(char *fname)
{
int i;
ifstream infile(fname,ios_base::in);
if(!infile)
cout<<"wrong input!!"<<endl;
ARRAYINFO INFO;
infile >> INFO.K;
infile >> INFO.N1;
infile >> INFO.N2;
INFO.x = new double[INFO.N1];
INFO.y = new double[INFO.N2];
for(i = 0;i < INFO.N1;i++)
infile >> INFO.x[i];
for(i = 0;i < INFO.N2;i++)
infile >> INFO.y[i];
infile.close();
return INFO;
}

/*
根据读入的文件信息 计算和序列中第K 小的元素
输入:输入文件的相关信息
输出:两序列的元素和序列中的第K 小的元素值
*/
double CalcKthSmallestElem(ARRAYINFO info)
{
int i,j;
int sum_1,sum_2;
sum_1 = info.N1*info.N2;
double *Sum = new double[sum_1];
double Sum_3;
for(i = 0;i < info.N1;i++)
for(j = 0;j < info.N2;j++)
{
sum_2 = i*info.N2 + j;
Sum[sum_2] = info.x[i] + info.y[j];
}
quick_sort(Sum,sum_1);
Sum_3 = Sum[info.K-1];
delete []Sum;
return Sum_3;
}

void swap(double *a, double *b) //交换函数
{
double temp = *a;
*a = *b;
*b = temp;
}

int partition(double *Array, int low, int high)
{
int middle = (low+high)/2;
int i,j;
double pivot; //选择第一个元素,最后一个元素,中间元素中的中间值作为支点
if (Array[middle] < Array[low])
swap(&Array[middle], &Array[low]);
  if (Array[high] < Array[low])
swap(&Array[high], &Array[low]);
if (Array[high] < Array[middle])
swap(&Array[high], &Array[middle]);
  pivot = Array[middle]; // 选中支点
swap(&Array[middle], &Array[high-1]);//将支点值换到倒数第二个位置
for (i=low, j=high-1; ;)
{
while (Array[++i]<pivot) {} //找到一个大于支点的元素
  while (pivot<Array[--j]) 
{
if(j == low)
break;
} //找到一个小于支点的元素
  if (i < j)
{ //交换两个元素
swap(&Array[i],&Array[j]);
}
else
break;
}
swap(&Array[i], &Array[high-1]); //将支点换回i点, 第一次分组结结束
return i;
}

void quicksort(double *Array, int low, int high)
{
int piovt_pos;
if (low < high)
{
piovt_pos = partition(Array, low, high);//分组
quicksort(Array, low, piovt_pos-1);
quicksort(Array, piovt_pos+1, high);
}
}

void quick_sort(double *Array, int size)
{
quicksort(Array, 0, size-1);
}
读取文件内容如下:

2
3 2
1.12 3.09 4.00
6.13 7.78
输出结果如下:

7.25
Time-Used:41(ms)
只有当k值为2或1时,输出是错的,也就是排序出来的序列结果,第一个和第二个是相反的,其他数据则可以从小到大正确排序。找了半天没有找到原因所在,跪求高人解答,不胜感激

作者: mlkmx   发布时间: 2011-12-17

自挽~~~~(>_<)~~~~

作者: mlkmx   发布时间: 2011-12-17