[ARGORITHM]ソート


1.ソート

  • データは、特定の基準に従って
  • の順に列挙する.

    ソートの選択

  • 未処理のデータの中から最小のデータを選択し、
  • を最上位のデータで置換する.
  • のナビゲーション範囲はますます小さくなり、ナビゲーション範囲と同じ最小データを検索する必要があるため、線形ナビゲーション-二重反復
  • 時間複雑度O(N*N)
  •   array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8 ]
    
      for i in range(len(array)):
          min_index = i # 가장 작은 원소의 인덱스
          for j in range(i+1, len(array)):
              if array[min_index] > array[j]:
                  min_index = j
          array[i], array[min_index] = array[min_index], array[i] # 스와프
    
      print(array)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    整列挿入

  • の未処理データを選択し、適切な位置
  • に挿入する.
  • は選択ソートよりも有効
  • である.
  • 時間複雑度O(N*N)であるが、データが整列状態に近い場合、O(N)
  •   array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
    
      for i in range(1, len(array)):
          for j in range(i, 0, -1): # 인덱스 1~i부터 i까지 1씩 감소하며 반복되는 문법
              if array[j] < array[j-1]: # 한 칸씩 왼쪽으로 이동
                  array[j], array[j-1] = array[j-1], array[j]
              else: # 자기보다 작은 데이터를 만나면, 그 위치에서 멈춤
                  break
    
      print(array)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    クイックソート

  • 既存のデータをどのように設定するか、および標準より大きいデータと標準より小さいデータの位置をどのように変更するか
  • .
  • 最も一般的な
  • マージソートの最も簡単なソートアルゴリズム
  • 最初のデータを標準データ(PIVOT)
  • に設定.
  • 時間の複雑さが理想的な場合、N O(logN)=幅高さ=>が半分に分割されると、最悪の場合O(N*N)=>0 1 2 3 4 6 7 8 9となり、N本の軸心で並べ替えられる.

    ソース。

    ## 퀵 정렬
    # 왼쪽 데이터는 피봇보다 크고, 오른쪽 데이터는 피봇보다 작아야
    # 퀵 정렬은 재귀로 -> 계속분할이 일어남
    # 분할은 pivot과 right의 원소가 바뀌는것
    
    array= [5, 7, 9, 0, 3, 1 ,6 ,2 ,4 ,8]
    
    def quick_sort(array, start, end):
        if start >= end : # 원소 1개인 경우 종료
            return
        pivot = start # 피봇 첫번째 원소
        left = start +1
        right = end
    
        # 분할 기준 왼 < 오 위치 안바뀌는 경우
        while(left <= right):
            # 피봇보다 큰 데이터 찾을 때까지 , 
            while(left<= end and array[left] <= array[pivot]):
                left += 1
    
            # 피봇보다 작은 데이터 찾을 때까지
            while (right>start and array[right]>= array[pivot]):
                right -= 1
    
            # 엇갈렸다면, 작은 데이터와 피봇 교체
            if(left > right):
                array[right], array[pivot] = array[pivot], array[right]
            else: # 엇갈리지 않았다면 작은 데이터와 큰 데이터를 교체
                array[left], array[right] = array[right], array[left]
    
        # 분할 이후 왼쪽 부분과 오른쪽 부분에서 각각 정렬 수행 , pivot <-> right
        quick_sort(array, start, right-1)
        quick_sort(array, right+1, end)
    
    quick_sort(array , 0, len(array)-1)
    print(array)
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    ドレッシング2パイジャー麺~

    array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]
    
    def quick_sort(array):
        # 리스트가 하나 이하의 원소만을 담고 있다면 종료
        if len(array) <= 1:
            return array
    
        pivot = array[0] # 피봇은 첫 번째 원소
        tail = array[1:] # 피봇ㅇ르 제외한 리스트
    
        # 기존 방법과 다르게 
        left_side = [x for x in tail if x<= pivot]  # 분할된 왼쪽
        right_side = [x for x in tail if x> pivot]
    
        # 분할 이후 왼쪽 부분과 오른쪽 부분에서 각각 정렬, 전체 리스트 반화
        return quick_sort(left_side)+ [pivot] + quick_sort(right_side)
    
    print(quick_sort(array))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    ソート数

  • クイック動作
  • データのサイズ範囲は限られており、整数形式で表す場合は
  • を用いる.
  • データ個数N,データの中で最もコストが高いのはK日,最悪は実行時間(n+k),空間複雑度O(logn)
  • である.
  • 同じ値のデータが複数存在する場合には
  • を用いる.
  • を使用し、最大データと最小データの差は1000000を超えない
      # 모든 원소의 값이 0보다 크거나 같다고 가정
      array = [7, 5, 9, 0, 3, 1, 6, 2, 9, 1, 4, 8, 0, 5, 2 ]
    
      # 모든 범위를 포함하는 리스트 선언(모든 값은 0으로 초기화)
      count = [0]  * (max(array)+1)
    
      for i in range(len(array)):
          count[array[i]] += 1
    
      for i in range(len(count)):
          for j in range(count[i]):
              print(i, end=' ')
    0 0 1 1 2 2 3 4 5 5 6 7 8 9 9

    Pythonのソートライブラリ


    ソート()結合ソートに基づいて作成され、O(Nlogn)

    整理する


    並べ替えアルゴリズム平均時間複雑度空間複雑度特性選択並べ替えO(N*N)O(N)単純挿入並べ替えO(N*N)O(N)並べ替え時の効率高速並べ替えO(N*logN)O(N)十分高速カウント並べ替えO(N+k)O(N+k)データサイズが限られている場合の効率,高速
  • 空間複雑度:メモリ使用量
  • キーのソート

    ## 키 기준 정렬 예제
    array = [('바나나', 2), ('사과', 3), ('당근', 1)]
    
    def setting(data):
        return data[1]
    
    result = sorted(array, key=setting)
    print(result)
    [(『にんじん』,1),(『バナナ』,2),(『りんご』,3)]

    画像として理解する