zoukankan      html  css  js  c++  java
  • 快速排序

    算法导论 第七章 快速排序

    C程序代码如下:

     1 /**
    2 * Quicksort
    3 * 分解: 将数组A[p...r]划分成两个子数组A[p...q - 1]和A[q+1...r],使得A[p...q-1]
    4 * 中的元素均小于或等于A[q];A[q+1...r]中的元素均大于A[q]。
    5 * 特点: 1. 就地排序 2.平均时间复杂度为nlgn,最坏为n的2次方。
    6 */
    7 #include <stdio.h>
    8 #define ARRAY_LENGTH(a) (sizeof(a)/sizeof(*a))
    9
    10 inline void exchange(int* a, int* b) {
    11 int tmp = *a;
    12 *a = *b;
    13 *b = tmp;
    14 }
    15
    16 int privatekey(int * A, int p, int r) {
    17 int tmp = 0;
    18 int x = A[r];
    19 int i = p - 1;
    20 int j = p;
    21 for(; j < r; j++) {
    22 if (A[j] <= x) {
    23 i++;
    24
    25 exchange(A + i, A + j);
    26 }
    27 }
    28
    29 exchange(A + i + 1, A + r);
    30
    31 return i + 1;
    32 }
    33
    34 void quicksort(int * A, int p, int r) {
    35 if (p < r) {
    36 int q = privatekey(A,p,r);
    37 quicksort(A,p,q-1);
    38 quicksort(A,q+1,r);
    39 }
    40 }
    41
    42 int main() {
    43 int A[] = {2,8,7,1,3,5,6,4};
    44 int len = sizeof(A) / sizeof(int);
    45 int i = 0;
    46 quicksort(A,0,len - 1);
    47 for(i = 0; i < len; i++)
    48 printf("%d,", A[i]);
    49 printf("\n");
    50 return 0;
    51 }

    尾递归的实现如下:

    1 void quicksort_tail(int * A, int p, int r) {
    2 while (p < r) {
    3 int q = privatekey(A,p,r);
    4 quicksort_tail(A,p,q-1);
    5 p = q + 1;
    6 }
    7 }



  • 相关阅读:
    mkdir命令
    pwd命令
    chmod命令
    chown命令
    chgrp命令
    687. Longest Univalue Path
    HYSBZ 1036 树的统计Count (水题树链剖分)
    POJ 3709 K-Anonymous Sequence (斜率优化DP)
    LightOJ 1065 Island of Survival (概率DP?)
    LightOJ 1248 Dice (III) (水题,期望DP)
  • 原文地址:https://www.cnblogs.com/lotushy/p/2309059.html
Copyright © 2011-2022 走看看