快速排序C++实现

 注意红色部分为易错部分,蓝色部分的++不写也照样对,只不过每轮多比较一次已比过的数。还有q哨兵数一般选哪个都行,指的是一个数组里的数而不是数组下标,这里的返回值i=j,返回的是p哨兵位置(pivote)。当然你也可以让p=下标,不过这样每次交换后也要改变p.而在上式,p每次都是固定的

 

#include <iostream>
using namespace std;

class quicksort {
public:
    int quicks(int *a, int low, int high) {
        int q = a[low]; // 基准
        int i = low;
        int j = high;

        while (i < j) {
            while (q <= a[j] && i < j) {
                j--;
            }
            if (i < j) {
                swap(a[i++], a[j]);
            }
            while (a[i] <= q && i < j) {
                i++;
            }
            if (i < j) {
                swap(a[i], a[j--]);
            }
        }
        return j;
    }

    void quicksorts(int *a, int low, int high) {
        if (low < high) {
            int pivot = quicks(a, low, high);
            quicksorts(a, low, pivot - 1);
            quicksorts(a, pivot + 1, high);
        }
    }
};

int main() {
    int arr[] = {2, 14, 32, 182, 34, 605, 99, 9, 7, 54, 22, 6, 7};
    quicksort qs;
    int len = sizeof(arr) / sizeof(int);
    qs.quicksorts(arr, 0, len - 1);
    for (int a = 0; a < len; a++) {
        cout << arr[a] << "_ ";
    }
    return 0;
}

 

posted on 2015-10-16 20:03  邗影  阅读(1924)  评论(2)    收藏  举报

导航