本文建立在基础版的快速排序已掌握的前提下,这里只讲用聚集元素去优化快速排序
思路:
快速排序的聚集元素优化版是快排原有的基础上,将与基准值相同的元素聚集到数组的中间部分,如此就让快排在原有将数组一分为二的基础上,实现了把数组一分为三;而中间等于基准值的部分就不用再参与排序了,两边小于、大于基准值的部分进入后续排序
聚集元素的实现:
聚集元素的实现是将检测到等于基准值的元素移放至数组两头,等快排结束,//再将其放置在数组中间
代码:
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
void func(vector<int>& array, int begin, int end) {
int p1 = begin, p2 = end;
int p3 = p1 + 1, p4 = p2;
while(p2 > p1) {
if(array[p2] > array[begin]) p2--;
else if(array[p2] < array[begin]) {
if(array[p1] < array[begin]) p1++;
else if(array[p1] > array[begin]) {
array[p2] ^= array[p1];
array[p1] ^= array[p2];
array[p2] ^= array[p1];
} else if(p1 - begin > 1) {
array[p1] ^= array[p3];
array[p3] ^= array[p1];
array[p1++] ^= array[p3++];
}else p1++;
} else if(p2 == p4){
p2--;
p4--;
} else {
array[p4] ^= array[p2];
array[p2] ^= array[p4];
array[p4--] ^= array[p2--];
}
}
if(begin != p2) {
array[begin] ^= array[p2];
array[p2] ^= array[begin];
array[begin] ^= array[p2];
}
while(p3 > begin + 1) {
array[--p1] ^= array[--p3];
array[p3] ^= array[p1];
array[p1] ^= array[p3];
}
while(p4 < end) {
array[++p4] ^= array[++p2];
array[p2] ^= array[p4];
array[p4] ^= array[p2];
}
if(p1 - begin > 1) func(array, begin, p1 - 1);
if(end - p2 > 1) func(array, p2 + 1, end);
}
int main() {
srand(time(0));
vector<int> array(5);
for(int j = 0; j < 5; j++){
for (int i = 0; i < 5; i++) array[i] = rand()%(26);
func (array, 0, 4);
for (int i = 0; i< 5; i++) cout<<array[i]<<' ';
cout<<endl;
}
return 0;
}