排序算法——QuickSort、MergeSort、HeapSort(C++实现)

快速排序QuickSort

template <class Item>
void quickSort (Item a[], int l, int r) {
    if (r<=l)
        return;
    int i = partition(a, l, r);
    quickSort(a, l, i-1);
    quickSort(a, i+1, r);
}

template <class Item>
int partition (Item a[], int l, int r) {
    int i = l -1, j = r;
    Item v = a[r];
    for ( ; ; ) {
        while (a[++i] < v);
        while (a[--j] > v)
            if (j == i)    break;
        if (i >= j)    break;
        exch (a[i], a[j]);
    }
    exch (a[i], a[r]);
    return i;
}

快速排序的思想可以用来找出数组中第k大的数

template <class Item>
Item select (Item a[], int l, int r, int k) {
    if (r <= l)
        return a[l];
    int i = partition(a, l, r);
    if (i > k)
        select(a, l, i-1, k);
    if (i < k)
        select(a, i+1, r, k);
}

 

归并排序MergeSort

数组实现

template <class Item>
void merge(Item a[], int l, int m, int r) {
    int i, j;
    static Item aux[maxN];
    for (i = m; i>=l; i--)
        aux[i] = a[i];
    for (j = m; j<r; j++)
        aux[r+m-j] = a[j+1];
    for (int k = l; k<=r; k++) {
        if (aux[j] < aux[i])
            a[k] = aux[j--];
        else
            a[k] = aux[i++];
    }
}

template <class Item>
void mergeSort (Item a[], int l, int r) {
    if (r <= l)
        return;
    int m = (r+l) / 2;
    mergeSort(a, l, m);
    mergeSort(a, m+1, r);
    merge(a, l, m, r);
}

链表实现

link merge (link a, link b) {
    node dummy(0);
    link head = &dummy, c = head;
    while ((a!=0) && (b!=0)) {
        if (a->item < b->item) {
            c->next = a;
            c = a;
            a = a->next;
        }
        else {
            c->next = b;
            c = b;
            b = b->next;
        }
    }
    c->next = (a==0) ? b : a;
    return head->next;
}

link mergeSort (link c) {
    if (c==0 || c->next==0)
        return c;
    link a = c, b = c->next;
    while ((b!=0) && (b->next!=0)) {
        c = c->next;
        b = b->next->next;
    }
    return merge (mergeSort(a), mergeSort(b));
}

 

堆排序HeapSort

template <class Item>
void fixDown (Item a[], int k, int n) {
    while (2*k+1 < n) {
        int child = 2*k + 1;
        if ((child+1<n) && (a[child]<a[child+1])
            child++;
        if (a[k] < a[child]) {
            exch(a[k], a[child]);
            k = child;
        }
        else
            return;
}

template <class Item>
void heapSort (Item a[], int n) {
    int k;
    // 建堆
    for (k = n/2; k >= 0; k--) 
        fixDown(a, k, n);

    //排序
    while (n-1>0) {
        exch (a[0], a[n-1]);
        fixDown(a, k, --n);
    }
}

 

posted @ 2015-02-03 12:06  一同  阅读(675)  评论(0编辑  收藏  举报