1.随机化法
算法:随机产生一个下标(pos),和下标为left的数据进行交换,以left的值进行划分
void Print_Ar(int* br, int n)
{
if (br == NULL || n < 1) return;
for (int i = 0; i < n; ++i)
{
cout << br[i] << " ";
}
cout << endl;
}
//随机化法
int RandParitition(int* br, int left, int right)
{
srand(time(NULL));
int pos = rand() % (right - left + 1) + left;
std::swap(br[left], br[pos]);
return Paritition(br, left, right);
}
void PassQuick(int* br, int left, int right)
{
if (left < right)
{
int pos = RandParitition(br, left, right);
PassQuick(br, left, pos - 1);
PassQuick(br, pos + 1, right);
}
}
void QuickSort(int* br, int n)
{
if (br == NULL || n < 2) return;
PassQuick(br, 0, n - 1);
}
int main()
{
int ar[] = {
56,12,78,9.,34,23,100,56,45,67,89 };
int n = sizeof(ar) / sizeof(ar[0]);
QuickSort(ar, n);
Print_Ar(ar, n);
return 0;
}
2.三位取中法
算法:先算得中间位置的值,然后比较下标为left的值,中间位置的值,下标为right的值,用三个数的中间值和下标为letf的值进行交换,就是三位取中法
void Show(int* arr, int len)
{
for (int i = 0; i < len; ++i)
{
cout << arr[i] << " ";
}
cout << endl;
}
int Partition(int* arr, int low, int high)
{
int tmp = arr[low];
while (low < high)
{
while (low<high && arr[high]>tmp)
{
high--;
}
if (low < high)
{
arr[low] = arr[high