高速ソート-yamaguti.comp.ae.keio.ac.jp.pptVIP

  • 2
  • 0
  • 约6.46千字
  • 约 26页
  • 2016-09-21 发布于天津
  • 举报
高速ソート-yamaguti.comp.ae.keio.ac.jp

* * * * * * * * * * * * * * * * * * * * * 高速ソートと 安定結婚問題 平成24年12月14日 高速ソート 単純なソートアルゴリズム   バブルソート  O(n2)     選択ソート    O(n2)     挿入ソート    O(n2)   もっと高速なソートアルゴリズムは? 計算量が O(n log n) のソートアルゴリズム   クイックソート   ヒープソート   マージソート この中でクィックソートが最速 (ランダムデータに対して.不得手な場合もある) クイックソートの原理 まず、配列中の適当な要素を選ぶ    → これを枢軸(pivot)と呼ぶ 次のように要素を並べ替える    → これを分割(partition)という a[0]  ?????????? a[v-1] a[v] a[v+1] ??? a[n-1] a[v]より小(以下) a[v] a[v]より大(以上) 考え方: 分割統治法(divide and conquer) では、a[0],???,a[v-1]の部分と、     a[v+1],???,a[n-1]の部分は どうするか?      ↓ ピボットの選択 →分割を再帰的に繰り返せばよい! クィックソートのアルゴリズム概観 ①ソートするデータ区間のデータを得る ②区間内のデータ数が2以下の時 2-1:データ数が1以下の時なにもしない 2-2:データ数が2の時,必要なら交換 ③区間内のデータ数が3以上の時 3-1:区間内でピボットを選ぶ(便宜的に右端) 3-2:区間内で,ピボットより小さい区間(左半分)と大きい区間(右半分)に分割する 3-3:3-2の両区間を再帰的処理する /* 配列aのうち a[l]~a[r] を整列する */ quick_sort ( int a[ ], int l, int r ) {   if( 整列する要素が一つのみである )     return;   適当な要素 a[v] を枢軸にして、     a[v] より小さい要素を a[l]~a[v-1] に集め、     a[v] より大きい要素を a[v+1]~a[r] に集める     quick_sort ( a, l, v-1 ); /* 左の部分を整列する */     quick_sort ( a, v+1, r ); /* 右の部分を整列する */ } 分割のアルゴリズム 0a.一番右の要素を枢軸に選ぶ 0b.ポインタ i を左端に、ポインタ j を枢軸の    すぐ左に設定する 1.枢軸より大きな要素が見つかるまで    i を右へスキャン 2.枢軸より小さな要素が見つかるまで    j を左へスキャン 3. i が指す要素と j が指す要素を交換する 4. i と j がぶつかるまで1~3を繰り返す 5. j の指す要素と枢軸と交換する 55 3 74 20 13 87 46 30 ピボット i j 55 3 74 20 13 87 46 30 i j 13 3 74 20 55 87 46 30 j 13 3 74 20 55 87 46 30 i j 13 3 20 74 55 87 46 30 13 3 20 30 55 87 46 74 i i j j v 前半に<30,後半に>30を置く.それに反するものを入れ替える 左スキャンと右スキャンが交錯したらピボットをそこに置く→@ピボットの左にピボットより小さい値,右に大きい値があるはず 再帰版クイックソート /* 配列a[l]~a[r]を分割する。枢軸の添え字を返す */ int partition( int a[ ], int l, int r ) { int i, j, pivot, t; i = l – 1; j = r; /* ポインタ i と j を初期化する */ pivot = a[r]; /* いちばん右端の要素を枢軸にする */ for( ; ; ) { /* ポインタ i と j とがぶつかるまで繰り返す */ while( a[++i] pivot ) ; /* ポインタ i を右へ進める */ while( i j pivot a[j] ) ; /* ポインタ i を左へ進める */ if ( i = j ) break; /* ポインタ i と j がぶつかったらループを抜ける */ t = a[i]: a[i] = a[j]; a[j] = t; /* i の指す要素と j の指す要素を交換する */

文档评论(0)

1亿VIP精品文档

相关文档