快速排序顾名思义即是很快的排序(妈的智障....)
快速排序的版本很多。
取中快排,选取中间值将数组划分为左右两部分。
void midqsort(int a[], int left, int right)
{
int i = left, j = right;
int mid = a[(left + right) / 2];
int temp;
while (i <= j) {
while (a[i] < mid)
i++;
while (a[j] > mid)
j--;
if (a[i] >= mid && a[j] <= mid) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
}
if (j > left)
midqsort(a, left, j);
if (i < right)
midqsort(a, i, right);
}
当然还有更好理解的快排,每次将数组中间的那个数放到对应的位置。
//qsort函数:以增序对v[left]...v[right]进行排序
void qsort(int v[], int left, int right)
{
int i, last;
void swap(int v[], int i, int j);
if (left >= right) //若数组包含的元素数不少于两个
return; //则不执行任何操作
swap(v, left, (right+right) / 2);
last = left;
for (i = left+1; i <= right; i++) {
if (v[i] < v[left])
swap(v, ++last, i);
}
swap(v, left, right);
qsort(v, left, last-1);
qsort(v, left+1, right);
}
void swap(int v[], int i, int j)
{
int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
将该qsort函数推广后可用于对任何类型的数组进行排序。(摘自The C Programming Language)
void qsort(void *v[], int left, int right,
int (*comp)(void *, void *))
{
int i, last;
void swap(void *v, int, int);
if (left >= right)
return;
swap(v, left, (left+right) / 2);
last = left;
for (i = left+1; i <= right; i++) {
if ((*comp)(v[i], v[left]) < 0) {
swap(v, ++last, i);
}
}
swap(v, left, right);
qsort(v, left, last-1, comp);
qsort(v, last+1, right, comp);
}
该函数第一个形参为void *v[ ],一维数组排序时向函数传入每个元素的指针,调用时为&v[ ]。