#define MAXSIZE    10
typedef struct {
    int r[MAXSIZE + 1];
    int length;
} SqList;

void swap(SqList *L, int i, int j) {
    int tmp = L->r[i];
    L->r[i] = L->r[j];
    L->r[j] = tmp;
}
  • 氣泡排序法(Bubble Sort)

// 只是交換排序
void BubbleSort0(SqList *L) {
    int i, j;
    for (i = 1; i <= L->length; i++) {
        for (j = i + 1; j <= L->length; j++) {
            if (L->r[i] > L->r[j])
                swap(L, i, j);
        }
    }
}

void BubbleSort(SqList *L) {
    int i, j;
    for (i = 1; i <= L->length; i++) {
        // 由後往前
        for (j = L->length - 1; j >= i; j--) {
            if (L->r[j] > L->r[j + 1])
                swap(L, j, j + 1);
        }
    }
}

void BubbleSort2(SqList *L) {
    int i, j;
    Status flag = TRUE;
    for (i = 1; i <= L->length && flag; i++) {
        flag = FALSE;
        for (j = L->length - 1; j >= i; j--) {
            if (L->r[j] > L->r[j + 1]) {
                swap(L, j, j + 1);
                flag = TRUE;
            }
        }
    }
}
  • 最壞時間複雜度O(n^2)
  • 最優時間複雜度O(n)
  • 平均時間複雜度O(n^2)
  • 空間複雜度O(n),輔助空間O(1)

  • 簡單選擇排序法(Simple Selection Sort)

void SelectSort(SqList *L) {
    int i, j, min;
    for (i = 1; i < L->length; i++) {
        min = i;
        for (j = i + 1; j < L-length; j++) {
            if (L=>r[min] > L->r[j])
                min = j;
        }
        if (i != min)
            swap(L, i, min);
    }
}
  • 最壞時間複雜度O(n^2)
  • 最優時間複雜度O(n^2)
  • 平均時間複雜度O(n^2)
  • 空間複雜度O(n),輔助空間O(1)

  • 直接插入排序法(Straight Insertion Sort)

void InsertSort(SqList *L) {
    int i, j;
    for (i = 2; i <= L->length; i++) {
        if (L->r[i] < L->r[i- 1]) {
            L->r[0] = L->r[i];
            for (j = i - 1; L->r[j] > L->r[0]; j--)
                L->r[j + 1] = L->r[j];
            L->r[j + 1] = L->r[0];
        }
    }
}
  • 最壞時間複雜度O(n^2)
  • 最優時間複雜度O(n)
  • 平均時間複雜度O(n^2)
  • 空間複雜度O(n),輔助空間O(1)

  • Shell排序法(Shell Sort)

void ShellSort(SqList *L) {
    int i, j;
    int inc = L->length;
    do {
        inc = inc / 3 + 1;
        for (i = inc + 1; i <= L->length; i++) {
            if (L->r[i] < L->r[i - inc]) {
                L->r[0] = L->r[i];
                for (k = i - inc; j > 0 && L->r[0] < L->r[j]; j -= inc)
                    L->r[j + inc] = L->r[j];
                L->r[j + inc] = L->r[0];
            }
        }
    } while(inc > 1);
}

增量序列的最後一個增量值必須等於1

  • 最壞時間複雜度O(n^(3/2)) O(nlog2(n))
  • 最優時間複雜度O(n)
  • 平均時間複雜度O(n^2)
  • 空間複雜度O(n)

  • 堆積排序法(Heap Sort)

堆積是一種具有下列性質的完整二元樹

  • 每個節點的值都大(小)於或等於其左右孩子節點的值,稱為最大(小)堆積

P427

  • 合併排序法

123

  • 快速排序法

123

results matching ""

    No results matching ""