算法描述
- 对于一个数组中的元素(有重复)进行排序
- 如果数组元素个数大于一
- 随机选取一个基准
- 将小于基准的元素放到基准的左边
- 将大于基准的元素放到基准的右边
- [如果有重复元素]
- 将和基准相等的元素放到基准位置,连续排列
- 注意 :
- 在基准左侧找到的等值元素要,和放到基准左边
- 在右侧找到的要放到右边, 否则会使得小元素放到右边,大元素在左边的错误
- 递归的对于基准左右的数组进行上述操作
代码
```cppinclude
include
include
include
//元素个数 const int N = 20; //元素范围 const int MAXVAU = 100; //数组 int a[N]; using namespace std;
//随机获取
int partitionRandom(int q,int r){
//随机获取基准下标 [q : r] 中的数字
int p = rand()%(r-q+1)+q;
//将基准元素放到待序列最左边
int t = a[p];
a[p] = a[q];
a[q] = t;
//x 为基准值
int i=q,j=r+1,x = a[q];
//将小于基准值的元素放到基准值 左边 , 大于的放到右边
while(1){
while(a[++i]
//将和a[pivort]的值相同的元素集中 void Amass(int a[], int p, int r, int pivort, int& p1, int& pr) { int num1 = 0, num2 = 0;
for (int i = p; i <= r; i++) {
if (a[i] == a[pivort] && i != pivort) {
if (i < pivort - num1) {//左边重复的
num1++;
swap(a, i, pivort - num1);
}
else if (i > pivort + num2) {//右边重复的
num2++;
swap(a, i, pivort + num2);
}
}
}
p1 = pivort - num1;
pr = pivort + num2;
} //快速排序 void qsort(int q,int r){ if(q<r){ int pl,pr; //划分 int p = partitionRandom(q,r); //将和a[p]相等的元素聚集到p的两边 (针对有重复的元素) Amass(a,q,r,p,pl,pr); //对划分的子序列排序 qsort(q,pl-1);//左 qsort(pr+1,r);//右边 } }
int main()
{
srand(time(NULL));
int n = 0;
while(1){
//生成随机生成数组 并且 输出原数组
printf(“原数组 : “);
for(int i = 0;i
```