6.ソート-quick,merge


クイックソート


  • は、一般的に使用される高速ソートアルゴリズムである.
  • 時間複雑度は平均n log nであったが,最悪の場合O(n^2)であった.
  • n/a原理

  • ピボットと呼ばれる標準値を選択します.
  • は、軸心以下のグループ、軸心以上のグループに分けられる.
  • の2つのグループにおいて、それぞれの軸心が再び選択され、グループ化される.
  • を繰り返して並べ替えます.
  • コード#コード#

    static void quickSort(int[] a, int left, int right) {
      int pl = left;
      int pr = right;
      int x = a[(pl + pr) / 2]; // 피벗
      
      dp {
        while (a[pl] < x) pl++;
        while (a[pr] > x) pr--;
        if (pl <= pr)
          swap(a, pl++, pr--);
      } while (pl <= pr); // 피벗을 기준으로 그룹이 나뉘면 false가 된다.
      
      if (left < pr) quicksort(a, left, pr);
      if (pl < right) quickSort(a, pl, righ);
    }
  • コードは軸心を中間値とするが、実行効率を向上させる方法がある.
  • を分割する配列の最初の、中間および末尾要素をソートし、中間要素および末尾で2番目の要素を交換します.
  • 歳の要素を選択し、その中から1つの要素を選択すると、より信頼性が高くなります.
  • 歳の要素は分類されているので、これらの要素を除いてソートすればいいです.
  • 連結ソート


  • 配列を前後の2つの部分に分けて並べ替え、連結操作を繰り返して並べ替えるアルゴリズム.
  • 時間複雑度はO(n log n)で安定であった.
  • コード#コード#

    static int[] buff;
    buff = new int[n];
    
    static void mergeSort(int[] a, int left, int right) {
      if (left < right) {
        int i;
        int center = (left + right) / 2;
        int p = 0;
        int j = 0;
        int k = left;
        
        mergeSort(a, left, center);
        mergeSort(a, center + 1, right);
        
        // a의 왼쪽 그룹을 buffer에 복사
        for (i = left; i <= center; i++)
          buff[p++] = a[i];
          
        // a의 오른쪽 그룹이 끝나기 전 and buffer가 끝나기 전까지
        while (i <= right && j < p)
          // 두 그룹을 비교하여 작은 값을 a의 처음부터 삽입
          a[k++] = (buff[j] <= a[i]) ? buff[j++] : a[i++];
          
        // buffer의 요소가 남아있는 경우 a에 삽입
        while (j < p)
          a[k++] = buff[j++];
      }
    }
    
    buff = null;