[アルゴリズム]第5週第2回運転時


Chap04. Sorting


Quick-Sort :: O(nlgnnlgnnlgn)

  • Outline of average case analysis for quick-sort(informal analysis)
  • In-Place Quick-Sort
    In-placeアルゴリズム:少ないスペースを占有する
    O(1)spaceを使用しますが、戻りはO(lgn)
  • です.
    Algorithm inPlaceQuickSort(S, l, r)		// preorder traversal
    	/* Input: sequence S, ranks l and r
    	Output sequence S with the
    		elements of rank between l and r
    		rearranged in increasing order */
    	if l >= r
    		return
    	i <- a random integer between l and r
    	x <- S.elemAtRank(i)
    	(h, k) <- inPlacePartition(x)		// visit()
    	inPlaceQuickSort(S, l, h-1)		// L
    	inPlaceQuickSort(S, k+1, r)		// G
  • In-Place Partitioning

    pivot = 6
    L, E U G

    jとkが出会うまで次の3つのステップを繰り返します
    1.jを使用してpivot以上の値を検索
    2.kを使用してpivot未満の値を検索
    3.2つのインデックスjとkを
  • に交換する

    Merge sort :: O(nlgnnlgnnlgn)

  • Merging Sorted Sequences
    - Problem
    昇順に配列する2つのシーケンスA,Bが与えられると、
    並べ替えられたシーケンスCにマージ
    - Strategy
    Sequence AとBの一番左の値を比較し、より小さい値をsequence Cの
  • に挿入します.
  • Algorithm: Merge
  • Merge(A, B, C)
    if (A is empty)
    	rest of C = rest of B
    else if (B is empty)
    	rest of C = rest of A
    else if (first of A ≤ first of B)
    	first of C = first of A
    	Merge (rest of A, B, rest of C)
    else
    	first of C = first of B
    	Merge (A, rest of B, rest of C)
    return
    W(n)=n-1(最後に比較x)
  • Using Divide and Conquer: Mergesort
  • Algorithm: Mergesort
    -input:array Eとfirst,last
  • void mergeSort(Element[] E, int first, int last)	// postorder traversal
    if (first < last)
    	int mid = (first+last)/2;
    	mergeSort(E, first, mid);		// left
    	mergeSort(E, mid+1, last);		// right
    	merge(E, first, mid, last);		// visit()
    return;

    Optimal Algorithm
    * Quick-Sort Algorithm : Divide and Conquer
    * Merge sort Algorithm : Combine and Conquer