#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;
}
快速排序c++
最新推荐文章于 2023-06-21 21:55:50 发布