void quick(int *a, int start, int last)//快速排序
{
if (last - start <=1)
return;
if (last - start == 2)
{
if (a[start] < a[last-1])
{
int temp1 = a[start];
a[start] = a[last-1];
a[last-1] = temp1;
}
}
else
{
int i = start+1, j = last-1;
int temp = a[start];
while (i < j)
{
while (i <= j&&a[i] > temp)
i++;
while (j >= i&&a[j] < temp)
j--;
if (i < j)
{
int temp1 = a[i];
a[i] = a[j];
a[j] = temp1;
i++;
j--;
}
}
a[start] = a[j];
a[j]=temp;
for (int i = 0; i < 10; i++)
cout << a[i] << ' ';
cout << endl;
quick(a, start, j);
quick(a, j+1, last);
}
}
void quickThree(int *a, int first, int last)//三向排序,大量重复数据的快速排序
{
if (last - first <= 1)
return;
if (last - first == 2)
{
if (a[first] < a[last - 1])
{
int temp1 = a[first];
a[first] = a[last - 1];
a[last - 1] = temp1;
}
}
int lo=first,lk=first,le=last;
int i = first+1,j=last-1,temp=a[first];
while (i < le)
{
if (a[i] > temp)
{
int temp1 = a[i];
a[i] = a[lo];
a[lo] = temp1;
lo++;
}
if (a[i] == temp)
{
i++;
lk++;
}
else
{
while(j>lk)
{
if (a[j] < temp)
{
j--;
le--;
}
else
if (a[j] == temp )
{
a[j] = a[i];
a[i] = temp;
i++;
lk++;
le--;
lk--;
break;
}
else
if (a[j] > temp)
{
a[lo] = a[j];
a[j] = a[i];
a[i] = temp;
i++;
lk++;
le--;
j--;
break;
}
}
}
for (int q = 0; q < 10; q++)
cout << a[q] << ' ';
cout << endl;
}
quickThree(a, first, lo);
quickThree(a, lk + 1, last);
}
c++——快速排序、三相排序(针对重复元素的的快速排序)
最新推荐文章于 2024-08-03 21:06:31 发布