Competitive Programming

Yung-Sheng Lu

FEB 09, 2015

@NCKU-CSIE

Lecture 2

Outline

  • Sorting Algorithms

  • Searching Algorithms

  • Practices

Sorting Algorithms

將一群數字按照順序排好

  • 將數字放進循序性的資料結構

    • 例如:陣列 (Array),鏈結串列 (Linked List)

  • 使用有排序功能的資料結構

    • 例如:Binary Heap,Binary Search Tree (BST)

將資料按照某個特定欄位進行排序,此欄位稱作鍵值 (Key)

Sorting

基礎排序演算法

  • 選擇排序法 (Selection Sort)

  • 插入排序法 (Insertion Sort)

  • 氣泡排序法 (Bubble Sort)

  • 合併排序法 (Merge Sort)

  • 快速排序法 (Quick Sort)

Sorting Algorithms

進階排序演算法

  • Heap Sort

  • Counting Sort

  • Bucket Sort

  • Radix Sort

  • Flash Sort

  • 將資料分爲已排序未排序二個部分
  • 未排序的資料中找出最大 (最小) 值,放入已排序的資料後端
  • 重複進行,直到排序結束 (未排序的資料爲空)

Selection Sort

void selection_sort(int arr[], int N) {
    for (int i = 0; i < N - 1; ++i) {
        int min_index = i;

        for (int j = i + 1; j < N; ++j) {
            if (arr[j] < arr[min_index])
                min_index = j;
        }

        // Swap
        swap(arr[i], arr[min_index]);
    }
}
O(n^2)
O(n2)O(n^2)

Average Case: 

Extra Space: 

O(1)
O(1)O(1)
  • 將資料分爲已排序未排序二個部分
  • 將「未排序資料中的第一筆插入已排序的資料的適當位置
  • 重複進行,直到排序結束 (未排序的資料爲空)

Insertion Sort

void insertion_sort(int arr[], int N) {
    for (int i = 2; i < N; ++i) {
        int key = arr[i];
        int j = i - 1;
        while (j >= 0) {
            if (key < arr[j])
                arr[j + 1] = arr[j];
            else
                break;
            --j;
        }
        
        // Insert
        arr[j + 1] = key;
    }
}
O(n^2)
O(n2)O(n^2)

Average Case: 

Extra Space: 

O(1)
O(1)O(1)
  • 逐次比較相鄰的二項資料,依照排序條件 (由大至小或由小至大) 交換資料
  • 重複進行,直到排序結束
  • 每回合遞減需要比較的元素個數

Bubble Sort

void bubble_sort(int arr[], int N) {
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N - i - 1; ++j) {
            if (arr[j] > arr[j + 1])
                swap(arr[j], arr[j + 1]);
        }
    }
}
O(n^2)
O(n2)O(n^2)

Average Case: 

Extra Space: 

O(1)
O(1)O(1)
  • 利用 Divide and Conquer 解決排序問題
  • 將 N 筆資料分爲二等份 (大小皆爲 N/2),再將這二份大小爲 N/2 的資料分爲二等份 (大小皆爲 N/4),持續分割直到每份到資料量夠小 (每份只剩下 1 筆資料) 爲止
  • 分別將每份資料進行排序,並將資料兩兩一對進行合併,直到排序結束

Merge Sort

/* Divide */
void merge_sort(int arr[], int low, int high) {
    if (high > low) {
        merge_sort(arr, low, (low + high) / 2);
        merge_sort(arr, (low + high) / 2 + 1, high);
        merge(arr, low, high);
    }
}
/* Merge */
void merge(int arr[], int low, int high) {
    int sort[MAX], k = -1, mid = (low + high) / 2;
    for (int i = low, j = mid + 1; i <= mid || j <= high) {
        if (i > mid || arr[i] >= arr[j])
            sort[++k] = arr[j++];
        else if (j > high)
            sort[++k] = arr[i++];
        else
            sort[++k] = arr[i++];
    }
    
    k = 0;
    for (int i = low; i <= high; ++i)
        arr[i] = sort[k++];
}
O(n\log{n})
O(nlogn)O(n\log{n})

Average Case: 

Extra Space: 

O(n)
O(n)O(n)

Searching Algorithms

  • Competitions

  • Competitions

Practices

Competitive Programming - Lecture 2

By David Lu

Competitive Programming - Lecture 2

Competitive Programming - Lecture 2

  • 1,212