快速排序

代码如下,可以直接用,如有错误,欢迎指正。

#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;
}


运行演示:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值