快速排序c++

#include<iostream>
using namespace std;
/*
 快排-冒泡改进版 是最好一种内排序  涉及分治 递归 
*/
class Test{
 protected:
  int* data;
  int size;//数组数据个数 
  int low;//起始最左 
  int high;//起始最右 
 public:
  Test();
  Test(int Size);
  void QuickSort();//快排 假实现 
  friend int sort(int* arr, int low, int high);//快排 真实现 
  friend int partition(int* arr, int low, int high);//获得分界线索引
  friend istream&operator>>(istream& in,Test& t);//输入数组数据 
  friend ostream&operator<<(ostream& out,Test& t);//输出数组数据
};
int partition(int* arr, int low, int high){
 //指定左指针,右指针
 int i=low,j=high;
 //将第一个数作为基准值 挖坑
 int x=arr[low];//注意不一定去索引0 相应位置会变化的 
 //使用循环实现分区操作
 while(i<j){
  //从右向左移动j 找到第一个小于基准值 x
  while(i<j&&arr[j]>=x)//i<j 这个条件很重要 
   j--;
  //将右侧找到第一个小于基准值加入到左坑中 左指针i++向中间移动位置
  if(i<j) {
   arr[i]=arr[j];//填坑 
   i++;
  }
  //这时j位置那个就被挖坟了 
  //从左向右移动i 找到第一个大于等于基准值 x
  while(i<j&&arr[i]<x)//i<j 这个条件很重要 
   i++;
  //将左侧找到第一个大于等于基准值 x加入到左坑中 右指针j--向中间移动位置
  if(i<j) {
   arr[j]=arr[i];//填坑 
   j--;
  }
 }
 //使用基准值填坑  这时他就在 两数据中间了  然后不断递归 直到排序完成  
 arr[i]=x;//或者j 最终在一起的
 //返回j基准值的位置
 return i;//或者j
}
int sort(int* arr, int low, int high){//快排 真实现 
 if(low<high) {//结束递归条件  不下就死循环了 
   //分区操作 返回分界线索引
   int index=partition(arr,low,high);
   //对左分区快排
   sort(arr,low,index-1);//对哪边快排 哪边不变 
   //对右分区进行快排
   sort(arr,index+1,high);
  }
} 
Test::Test():size(9),low(0),high(size-1){//默认数据个数为9 
 data=new int[size]; 
}
Test::Test(int Size):size(Size),low(0),high(size-1){
 data=new int[size];
}
void Test::QuickSort(){
 sort(data,low,high);
}
istream&operator>>(istream& in,Test& t){//输入数组数据 
 cout<<"输入"<<t.size<<"个整型数据:";
 for(int i=0;i<t.size;i++)
  in>>t.data[i]; 
 return in;
} 
ostream&operator<<(ostream& out,Test& t){//输出数组数据 
 for(int i=0;i<t.size;i++){
  if(!i)
   out<<"["<<t.data[i]<<",";
  else if(i<t.size-1)
   out<<t.data[i]<<",";
  else
   out<<t.data[i]<<"]"<<endl;
 }
 return out;
}
int main()
{
 //5 43 21 8 92 34 12 200 3 //测试用 9个数据 
 Test test;
 cin>>test;
 cout<<"排序前:"<<test;
 test.QuickSort();
 cout<<"排序后:"<<test;
 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值