代码如下,可以直接用,如有错误,欢迎指正。
#include <iostream>
#include<ctime>
#include<cstdlib>
#include<fstream>
using namespace std;
struct p
{
int x;
int y;
};
void Init(int n,int *r);
int method(int n,int * r,int begin,int end);
int quickSort(int *arr,int begin,int end,int WAY);
void Init(int n,int *r)
{
int x;
srand((unsigned)time(NULL));
FILE *fp;
fp=fopen("hello.txt","w+");
fprintf(fp,"%d ",n);
cout<<"数据顺序:1.随机 2.正序 3逆序:";
int l;
cin>>l;
switch(l)
{
case 1:
{
srand((unsigned)time(NULL));
for(int i=1;i<=n;i++)
{
x=rand() %1000;
fprintf(fp,"%d ",x);
}
rewind(fp);
fscanf(fp," %d",&n);
for(int i=0;i<n;i++)
fscanf(fp," %d",&r[i]);
}
case 2:
{
for(int i=1;i<=n;i++)
{
fprintf(fp,"%d ",i);
}
rewind(fp);
fscanf(fp," %d",&n);
for(int i=0;i<n;i++)
fscanf(fp," %d",&r[i]);
}
case 3:
{
for(int i=n;i>=1;i--)
{
fprintf(fp,"%d ",i);
}
rewind(fp);
fscanf(fp," %d",&n);
for(int i=0;i<n;i++)
fscanf(fp," %d",&r[i]);
}
}
}
void top(int *arr,int begin,int end,int WAY)
{
if(begin<end)
{ int i;
i=quickSort(arr,begin,end,WAY);
top(arr,begin,i-1,WAY);
top(arr,i+1,end,WAY);
}
else return;
}
int quickSort(int *arr,int begin,int end,int WAY)
{
int x=method(WAY,arr,begin,end);
int temp;
int i = begin; //从左到右进行查找时的“指针”,指示当前左位置
int j = end; //从右到左进行查找时的“指针”,指示当前右位置
//不重复遍历
if(x!=i) swap(arr[i],arr[x]);
temp=arr[i];
while(i < j)
{
//当右边的数大于基准数时,略过,继续向左查找
//不满足条件时跳出循环,此时的j对应的元素是小于基准元素的
while(i<j && arr[j] >= temp)
j--;
//将右边小于等于基准元素的数填入右边相应位置
arr[i] = arr[j];
//当左边的数小于等于基准数时,略过,继续向右查找
//(重复的基准元素集合到左区间)
//不满足条件时跳出循环,此时的i对应的元素是大于等于基准元素的
while(i<j && arr[i] <= temp)
i++;
//将左边大于基准元素的数填入左边相应位置
arr[j] = arr[i];
}
//将基准元素填入相应位置
arr[i] = temp;
return i;
//此时的i即为基准元素的位置
//对基准元素的左边子区间进行相似的快速排序
//如果区间只有一个数,则返回
}
int main()
{
int n;
int WAY;
srand((unsigned)time(NULL));
cout << "how many" << endl;
cin>>n;
int *r=(int *)malloc(n*sizeof(int));
Init(n,r);
cout<<"which method? 1.首元素 2.三数取中 3随机 4不同取大"<<endl;
cin>>WAY;
top(r,0,n-1,WAY);
for(int i=0;i<n;i++)
cout << r[i] << ' ';
free(r);
return 0;
}
int method(int n,int * r,int begin,int end)
{
int x=end-begin;
if(x==-1) return 0;
switch(n)
{
case 1:
return begin;
case 2:
{
if((x+1)<=3)
return begin;
else
{
int x1,x2,x3;
x1=begin+rand()%(x+1);
do{
x2=begin+rand()%(x+1);
}while(x1==x2);
if(r[x2]>r[x1])
x1=x2;
do{
x3=begin+rand()%(x+1);
}while(x3==x2||x3==x1);
if(r[x3]>r[x1])
x1=x3;
return x1;
}
}
case 3:
{
int x1;
x1=begin+rand()%(x+1);
return x1;
//}
}
case 4:
{
if(x==0)
return begin;
//int x1=r[begin]>r[begin+1]?begin:(begin+1);
else if(r[begin]>r[begin+1])
return begin;
else
return begin;
}
}
return 0;
}
运行演示: