1.pivot的左边< 右边>
2.左边最大值<=pivot 右边最小值> pivot即可 一次遍历存储每个i左边最大值,右边最小值即可完成
3.我想模拟一遍 所以没有采用2的方法 然后 TLE一部分
模拟思路:
1.一次就好 无需递归
2.注意ki为区分点 和之前快排模板里的low high区分开,即判定条件适当改变
3.加flag标记是否交换 交换则说明不是pivot位置
#include <bits/stdc++.h>
using namespace std;
void QuickSort(vector<int> Array,vector<int> &ans, int left,int right, int ki) {
int low,high;
bool flag = true;
if(left>=right) return;
low=left,high=right;
int key = Array[ki];//pivot
while(ki<high) {
while(ki<high && key<=Array[high]) high--;
if(ki < high) {
Array[ki]=Array[high];
ki = high;
flag = false;
}
while(ki>low && Array[low]<=key) low++;
if(ki > low) {
Array[ki]=Array[low];
ki = low;
flag = false;
}
}
Array[ki]=key;
if(flag) {
ans.push_back(key);
}
// QuickSort(Array,left,low-1);
// QuickSort(Array,low+1,right);
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int i, n;
cin>>n;
vector<int>a(n), ans;
for(i=0; i<n; i++)scanf("%d",&a[i]);
ans.clear();
for(int i=0; i<n; i++)
QuickSort(a, ans, 0, n-1, i);
sort(ans.begin(), ans.end());
printf("%d\n",ans.size());
if(ans.size() > 0) printf("%d",ans[0]);
for(i=1;i<ans.size();i++)printf(" %d",ans[i]);
printf("\n");
return 0;
}