还是快速排序

来源:互联网 发布:mac终端查看ip地址 编辑:程序博客网 时间:2024/06/14 05:43

使用三数中指法可以进一步提升快速排序的效率,实现如下:

int median3(int *arr, int left, int right){    int center = (left + right) / 2;    if (arr[left] > arr[center]) {    swap(arr[left], arr[center]);    }    if (arr[left] > arr[right]) {    swap(arr[left], arr[right]);    }    if (arr[center] > arr[right]) {    swap(arr[center], arr[right]);    }    swap(arr[center], arr[right - 1]);    return arr[right - 1];}void insert_sort(int *arr, int left, int right){    int i, j, key;    for (i = left; i <= right; ++i) {    key = arr[i];    for (j = i; j > left && arr[j - 1] > key; --j) {        arr[j] = arr[j - 1];    }    arr[j] = key;    }}#define cutoff 3void qsort(int *arr, int left, int right){    if (left + cutoff <= right) {    int pivot = median3(arr, left, right);    int i = left;    int j = right - 1;    for (;;) {        while (arr[++i] < pivot) {        }        while (arr[--j] > pivot) {        }        if (i < j) {        swap(arr[i], arr[j]);        } else {        break;        }    }    swap(arr[i], arr[right - 1]);    qsort(arr, left, i - 1);    qsort(arr, i + 1, right);    } else {    insert_sort(arr, left, right);    }}
0 0