带阈值的快速排序(因为在数据量比较小的时候,快速排序的递归还不如简单的插入排序来得快,所以设定一个阈值,在待排数据量比较小的时候直接用插入排序)
#include <iostream>
using namespace std;
#define cutoff 100
void Quick_Sort(int *a, int n);
void quickSort(int *a, int left, int right);
int fPivot(int *a, int left, int right);
void swap(int *a, int *b);
void insertionSort(int *a, int n);
int main(int argc, char *argv[])
{
}
void Quick_Sort(int *a, int n) //给快速排序加个外壳,使其符合标准接口
{
quickSort(a, 0, n - 1);
}
void quickSort(int *a, int left, int right) //快速排序
{
if (right - left + 1 > cutoff)
{
int p = fPivot(a, left, right);
int i = left - 1, j = right - 2;
while (true)
{
while (a[i++] < p) {}
while (a[j--] > p) {}
if (i < j)
swap(&a[i], &a[j]);
else
{
swap(&a[i], &a[right - 1]);
break;
}
}
quickSort(a, left, i - 1);
quickSort(a, i + 1, right);
}
else insertionSort(&a[left], right - left + 1);
}
int fPivot(int *a, int left, int right) //选主元
{
int mid = (left + right) / 2;
if (a[left] > a[mid])
{
swap(&a[left], &a[mid]);
}
if (a[left] > a[right])
{
swap(&a[left], &a[right]);
}
if (a[mid] > a[right])
{
swap(&a[mid], &a[right]);
}
swap(&a[mid], &a[right - 1]);
return a[right - 1];
}
void swap(int *a, int *b) //交换
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void insertionSort(int *a, int n) //插入排序
{
if (n > 1)
{
for (int i = 1; i < n; i++)
{
int tmp = a[i];
int j;
for (int j = i; j > 0 && a[j - 1] > tmp; j--)
{
a[j] = a[j - 1];
}
a[j] = tmp;
}
}
}