찾다
백엔드 개발파이썬 튜토리얼Python에서 Hill 정렬 알고리즘을 구현하는 방법

    알고리즘 설명

    "증분 정렬 감소"라고도 불리는 힐 정렬은 삽입 정렬을 최적화하여 생성된 정렬 알고리즘입니다. 실행 아이디어는 배열의 요소를 아래 첨자 증분으로 그룹화하고, 각 요소 그룹을 삽입 및 정렬하고, 증분을 줄이고, 증분이 1에 도달할 때까지 이전 단계를 반복하는 것입니다.

    일반적으로 Hill 정렬의 시간 복잡도는 증분 크기에 따라 O(n1.3)~O(n2)입니다. Hill 정렬의 공간 복잡도는 O(1)로 불안정한 정렬 알고리즘입니다. Hill 정렬을 수행할 때 요소의 한 번의 이동은 여러 요소에 걸쳐 있을 수 있으며, 이는 여러 이동을 상쇄하고 효율성을 향상시킬 수 있습니다.

    다음은 (배열 길이/2)를 초기 증분으로 사용하는 오름차순 Hill 정렬입니다. 각 정렬 후에 증분은 절반으로 줄어듭니다.

    1단계:

    그림 2-28에 표시된 대로 첫 번째 요소부터 시작하여 4씩 증가하여 그룹화합니다. 증분이 4인 경우 그룹에 요소가 두 개만 있고 그렇지 않으면 요소의 첨자가 배열 범위를 초과한다는 것을 알 수 있습니다.

    Python에서 Hill 정렬 알고리즘을 구현하는 방법

    2단계:

    그림 2-29와 같이 그룹의 요소에 대해 삽입 정렬을 수행합니다.

    Python에서 Hill 정렬 알고리즘을 구현하는 방법

    3단계:

    그림 2-30과 같이 계속해서 동일한 방법으로 그룹화하고, 그룹에 요소를 삽입하고 정렬하여 순서대로 만듭니다.

    Python에서 Hill 정렬 알고리즘을 구현하는 방법

    전체 배열의 모든 숫자를 순회한 후 이 정렬 라운드가 종료됩니다. 증분을 절반으로 줄이고 다음 정렬 라운드를 계속합니다.

    4단계:

    그림 2-31과 같이 증분량이 2가 되면 각 그룹의 요소가 증가하고 전체 그룹 수가 감소하는 것을 알 수 있습니다. 각 그룹을 탐색할 때까지 각 그룹의 요소를 계속해서 삽입 정렬합니다.

    Python에서 Hill 정렬 알고리즘을 구현하는 방법

    5단계:

    그림 2-32에 최종 정렬 단계가 표시됩니다. 이때 증분은 1이 됩니다. 이는 전체 배열의 삽입 정렬과 같습니다. 즉, 마지막 라운드 정렬입니다.

    Python에서 Hill 정렬 알고리즘을 구현하는 방법

    마지막 정렬을 마치고 전체 힐 정렬이 끝났습니다.

    코드 구현

    for 루프에서는 각 그룹의 첫 번째 요소를 삽입하고 정렬할 필요가 없고 해당 첨자가 0에서 step-1 사이이므로 순회는 첨자 단계부터 시작됩니다.

    순서도에서 접근 방식을 시뮬레이션하려면 두 개의 루프를 사용해야 한다는 점에 유의해야 합니다. 첫 번째 그룹을 사용한 다음 동일한 그룹의 요소를 한 번에 주문합니다. 효율성을 높이기 위해 숫자를 탐색할 때마다 해당 숫자가 위치한 그룹을 삽입하고 정렬하는 for 루프를 직접 사용합니다. 이 순회는 삽입 정렬의 순서 요구 사항도 충족합니다. 삽입 정렬에서는 현재 첨자의 값을 변경해야 하므로 for 루프에 영향을 미치지 않도록 현재 첨자를 저장하는 데 변수 ind가 사용됩니다.

    일반 삽입 정렬은 1 증분의 Hill 정렬과 동일합니다. 요소 전체의 Hill 정렬은 실제로 증분만 변경하며 논리적으로 일반 삽입 정렬과 다르지 않습니다.

    Hill 정렬 코드:

    nums = [5,3,6,4,1,2,8,7]
    def ShellSort(nums):
      step = len(nums)//2         #初始化增量为数组长度的一半
      while step > 0:           #增量必须是大于0的整数
       for i in range(step,len(nums)): #遍历需要进行插入排序的数
         ind = i
         while ind >= step and nums[ind] < nums[ind-step]: #对每组进行插入排序
          nums[ind],nums[ind-step] = nums[ind-step],nums[ind]
          ind -= step
       step //= 2           #增量缩小一半
      print(nums)
    ShellSort(nums)

    프로그램을 실행하면 출력 결과는 다음과 같습니다.

    [1,2,3,4,5,6,7,8]

    위 내용은 Python에서 Hill 정렬 알고리즘을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명
    이 기사는 亿速云에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
    Python vs. C : 응용 및 사용 사례가 비교되었습니다Python vs. C : 응용 및 사용 사례가 비교되었습니다Apr 12, 2025 am 12:01 AM

    Python은 데이터 과학, 웹 개발 및 자동화 작업에 적합한 반면 C는 시스템 프로그래밍, 게임 개발 및 임베디드 시스템에 적합합니다. Python은 단순성과 강력한 생태계로 유명하며 C는 고성능 및 기본 제어 기능으로 유명합니다.

    2 시간의 파이썬 계획 : 현실적인 접근2 시간의 파이썬 계획 : 현실적인 접근Apr 11, 2025 am 12:04 AM

    2 시간 이내에 Python의 기본 프로그래밍 개념과 기술을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우기, 2. 마스터 제어 흐름 (조건부 명세서 및 루프), 3. 기능의 정의 및 사용을 이해하십시오. 4. 간단한 예제 및 코드 스 니펫을 통해 Python 프로그래밍을 신속하게 시작하십시오.

    파이썬 : 기본 응용 프로그램 탐색파이썬 : 기본 응용 프로그램 탐색Apr 10, 2025 am 09:41 AM

    Python은 웹 개발, 데이터 과학, 기계 학습, 자동화 및 스크립팅 분야에서 널리 사용됩니다. 1) 웹 개발에서 Django 및 Flask 프레임 워크는 개발 프로세스를 단순화합니다. 2) 데이터 과학 및 기계 학습 분야에서 Numpy, Pandas, Scikit-Learn 및 Tensorflow 라이브러리는 강력한 지원을 제공합니다. 3) 자동화 및 스크립팅 측면에서 Python은 자동화 된 테스트 및 시스템 관리와 ​​같은 작업에 적합합니다.

    2 시간 안에 얼마나 많은 파이썬을 배울 수 있습니까?2 시간 안에 얼마나 많은 파이썬을 배울 수 있습니까?Apr 09, 2025 pm 04:33 PM

    2 시간 이내에 파이썬의 기본 사항을 배울 수 있습니다. 1. 변수 및 데이터 유형을 배우십시오. 이를 통해 간단한 파이썬 프로그램 작성을 시작하는 데 도움이됩니다.

    10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법?10 시간 이내에 프로젝트 및 문제 중심 방법에서 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법?Apr 02, 2025 am 07:18 AM

    10 시간 이내에 컴퓨터 초보자 프로그래밍 기본 사항을 가르치는 방법은 무엇입니까? 컴퓨터 초보자에게 프로그래밍 지식을 가르치는 데 10 시간 밖에 걸리지 않는다면 무엇을 가르치기로 선택 하시겠습니까?

    중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까?중간 독서를 위해 Fiddler를 사용할 때 브라우저에서 감지되는 것을 피하는 방법은 무엇입니까?Apr 02, 2025 am 07:15 AM

    Fiddlerevery Where를 사용할 때 Man-in-the-Middle Reading에 Fiddlereverywhere를 사용할 때 감지되는 방법 ...

    Python 3.6에 피클 파일을로드 할 때 '__builtin__'모듈을 찾을 수없는 경우 어떻게해야합니까?Python 3.6에 피클 파일을로드 할 때 '__builtin__'모듈을 찾을 수없는 경우 어떻게해야합니까?Apr 02, 2025 am 07:12 AM

    Python 3.6에 피클 파일로드 3.6 환경 보고서 오류 : modulenotfounderror : nomodulename ...

    경치 좋은 스팟 코멘트 분석에서 Jieba Word 세분화의 정확성을 향상시키는 방법은 무엇입니까?경치 좋은 스팟 코멘트 분석에서 Jieba Word 세분화의 정확성을 향상시키는 방법은 무엇입니까?Apr 02, 2025 am 07:09 AM

    경치 좋은 스팟 댓글 분석에서 Jieba Word 세분화 문제를 해결하는 방법은 무엇입니까? 경치가 좋은 스팟 댓글 및 분석을 수행 할 때 종종 Jieba Word 세분화 도구를 사용하여 텍스트를 처리합니다 ...

    See all articles

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

    AI Hentai를 무료로 생성하십시오.

    인기 기사

    R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 최고의 그래픽 설정
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
    3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
    4 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

    뜨거운 도구

    드림위버 CS6

    드림위버 CS6

    시각적 웹 개발 도구

    SecList

    SecList

    SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

    PhpStorm 맥 버전

    PhpStorm 맥 버전

    최신(2018.2.1) 전문 PHP 통합 개발 도구

    ZendStudio 13.5.1 맥

    ZendStudio 13.5.1 맥

    강력한 PHP 통합 개발 환경

    SublimeText3 Linux 새 버전

    SublimeText3 Linux 새 버전

    SublimeText3 Linux 최신 버전