快速排序一次划分的应用
#include<iostream>
using namespace std;
void swap(int *arr, int i, int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void paritition(int *arr, int n){
int left = 0;
int right = n - 1;
while(left < right){
while(left < right && arr[left] < 0){
left ++;
}
while(left < right && arr[right] > 0){
right --;
}
if(left < right){
swap(arr, left, right);
}
}
}
int main()
{
int arr[9] = {-5,3,2,-1,4,-3,-4,5,9};
paritition(arr, 9);
for(int i = 0; i < 9; i ++){
cout<<arr[i]<<" ";
}
cout<<endl;
return 0;
}
CD分类问题:字符串只有C和D字符组成,最后将字符串调整为只有一个C和D相邻,求最小交换次数
如CCDCC,最小交换次数为2次,交换成功之后为CCCCD
#include<iostream>
#include<string>
using namespace std;
//分类之后的ch在左边
int partition(string &str, char &ch){
int count = 0;
int left = 0;
int right = str.length() - 1;
while(left < right){
while(left < right && str[right] != ch){
right --;
}
while(left < right && str[left] == ch){
left ++;
}
if(left < right){
left ++;
right --;
count ++;
}
}
return count;
}
int main(){
string str;
cin>>str;
char c = 'C';
char d = 'D';
int count1 = partition(str, c);
int count2 = partition(str, d);
cout<<(count1 <= count2 ? count1 : count2)<<endl;
return 0;
}