가장 모호한 정렬 알고리즘은 무엇입니까? [닫은]


22

방금 sortvis.org 블로그 게시물을 통해 cyclesort 에 대해 읽었 습니다. 이것은 내가 지금까지 들어 본 것 중 가장 모호한 것입니다. 왜냐하면 익숙하지 않은 수학을 사용하기 때문입니다 (정수 세트의 순열에서주기를 감지).

가장 모호한 것이 무엇입니까?


4
다시 읽으셔야합니다.
— Mark C

이것으로 좋은 타이밍, 내 데이터 구조 클래스는 정렬을 다루기 시작했습니다. 이제 기본적인 종류뿐만 아니라 미친 것도 이해합니다.
— Jason

답변:



12

Slowsort 는 나누고 정복하는 것이 아니라 곱셈과 항복으로 작동합니다. 그것은 아마도 가장 효율적으로 구축 될 수있는 가장 효율적인 정렬 알고리즘이기 때문에 흥미 롭습니다.

최상의 경우 bogosort는 매우 효율적으로, 즉 어레이가 이미 정렬 된 경우 bogosort에서 상쇄됩니다. Slowsort는 그러한 최고의 행동으로부터 "고통"하지 않습니다. 가장 좋은 경우에도 여전히 ϵ > 0의 런타임 $ \ Omega (n ^ \ frac {\ log_2n} {2+ \ epsilon}) $ 이 있습니다.

다음은 독일 위키피디아 기사 에서 수정 한 의사 코드입니다 .

function slowsort(A, i, j):
  if i >= j: return

  m = (i + j) / 2
  slowsort(A, i, m)
  slowsort(A, m + 1, j)

  if A[j] < A[m]:
    swap(A[j], A[m])

  slowsort(A, i, j - 1)

1
Bogosort는 단계 순서를 반대로함으로써 가장 좋은 경우에 사소하게 더 많은 비난을 줄 수 있습니다. 먼저 셔플. 정렬 된 경우 중지하십시오.
— Alex Feinman

3
@Alex : 아니오. 아무것도 바뀌지 않습니다. 첫 번째 단계 이후에도 보고 소트는 여전히 완료 되었을 것입니다. 우연히 셔플 링이 순서를 정렬했기 때문입니다. Bogosort는 여전히 최악의 경우 및 평균 경우와 근본적으로 다른 런타임 (O (n))으로 뚜렷한 최상의 행동을 보여줍니다. Slowsort는 단순히 이것을 가지고 있지 않습니다.
— Konrad Rudolph

아, 나는 실행 경로가 아니라 초기 조건만을 생각하고 있었다!
— Alex Feinman

이것을 사랑하십시오 :) 무차별적인 힘 같은 것은 ...

8

이것이 모호한 것으로 간주되는지 모르겠지만 가장 어리석은 정렬 "알고리즘"중 하나는 Bogosort 입니다. Bogosort 페이지의 링크도 재미 있습니다.

그리고 "quantum bogo-sort"섹션에서이 보석이 있습니다.

2N 유니버스를 만드는 것도 메모리를 많이 사용합니다.

흠 ... 당신은 말할 수 있습니다 :-).


난이게 좋아. 나는 특히 "Quantum bogosort"의 아이디어를 좋아한다 :-)
— Dean Harding

6

또 다른 모호한 "알고리즘"은 Intelligent Design Sort 이지만 알고리즘이 빠르거나 메모리 소비가 적습니다. :)


이 알고리즘의 가장 큰 특징 중 하나는 작동한다는 것을 알고 있다는 것입니다. 어떤 것도 분석하거나 증명할 필요가 없습니다.
— Caleb

6

수면 정렬 은 다소 참신합니다.

    #!/bin/bash
    function f() {
        sleep "$1"
        echo "$1"
    }
    while [ -n "$1" ]
    do
        f "$1" &
        shift
    done
    wait

사용법 예 :

    ./sleepsort.bash 5 3 6 3 6 3 1 4 7

5

이 상황에서도 거품 정렬이 잘못된 대답이라고 생각합니다.

:)


3

연습 중 하나에 대한 답변으로 Knuth Volume 3 1 은 기본적으로 고대 코드 골프 인 이름없는 정렬 알고리즘을 구현합니다. MIX 어셈블리 언어로 작성할 수있는 가장 짧은 정렬입니다. 짧은 코드는 O (N 3 ) 복잡성의 최저 가격으로 제공됩니다 ...

1 적어도 구판. 새 버전에 대한 MIXAL의 수정 사항을 감안할 때 여전히 MIXAL이 있는지 또는 확실하지 않은지 MIXAL이 원래 MIXAL에 있는지 여부는 확실하지 않습니다.


3

내 데이터 구조 클래스에서 Stooge sort 의 정확성을 명시 적으로 증명해야했습니다 . 실행 시간은 O (n ^ {log 3 / log 1.5}) = O (n ^ 2.7095 ...)입니다.


2

그것이 가장 모호한 지 모르겠지만 스파게티 종류 는 그것을 사용할 수있는 상황에서 최고 중 하나입니다.


이것은“수면 분류”와 매우 유사하며 흥미롭게도 DNA 시퀀싱 (Sanger sequencing)을위한 생물 정보학에 사용됩니다.
— Konrad Rudolph

2

원본 Knuth 서적 중 하나 인 "정렬 및 검색"에는 하드 디스크를 사용하지 않고 테이프 파일을 정렬하는 프로세스를 나타내는 중간 단계가 있습니다. 필자는 6 개의 테이프 드라이브를 사용했으며 각 드라이브가 앞으로 읽기, 뒤로 읽기, 되감기 또는 유휴 상태 일 때 명시 적으로 표시했다고 생각합니다. 오늘날 그것은 쓸모없는 기술의 기념비입니다.


1

한 번 CRAY 어셈블러에서 벡터 레지스터 거품 정렬을 수행했습니다. 기계에는 이중 이동 명령이있어서 벡터 레지스터의 내용을 한 단어 씩 위 / 아래로 이동할 수 있습니다. 다른 모든 지점을 두 개의 벡터 레지스터에 넣으면 완료 될 때까지 다른 메모리 참조를 만들지 않고도 완전한 버블 정렬을 수행 할 수 있습니다. 거품 정렬의 N ** 2 특성을 제외하고는 효율적이었습니다.

또한 한 번의 정렬을 위해 가능한 한 빨리 길이 4 벡터의 부동 소수점 정렬을 수행해야했습니다. 테이블 조회 (A2-A1의 부호 비트는 하나의 비트, A3-A1의 부호는 다른 비트를 형성합니다 ...)를 사용하여 테이블에서 순열 벡터를 찾습니다. 실제로 내가 올 수있는 가장 빠른 솔루션이었습니다. 현대식 아키텍처에서는 잘 작동하지 않지만 부동 및 정수 단위는 너무 분리되어 있습니다.


여전히 소스가 있습니까? 확인하고 싶습니다!
— sova

소스가 없으며 궁극적으로 나를 해고시킨 회사의 쓸모없는 기계였습니다. 테이블 조회가 어렵지 않습니다 : sb1 = 1 & ((a2-a1) >> 63); sb2 = 2 & ((a3-a1) >> 62); ... index = sb1 | sb2 | sb3 ... followed 주문의 테이블 조회로.
— Omega Centauri

1

Google 코드 잼에는 Gorosort라는 알고리즘에 대한 문제가 있었으며 문제를 위해 발명했다고 생각합니다.

Goro에는 4 개의 무기가 있습니다. 고로는 매우 강하다. 당신은 Goro를 망칠 필요가 없습니다. Goro는 N 개의 다른 정수 배열을 정렬해야합니다. 알고리즘은 Goro의 힘이 아닙니다. 힘은 Goro의 힘입니다. Goro의 계획은 두 손으로 손가락을 사용하여 배열의 여러 요소를 잡고 가능한 한 세 번째와 네 번째 주먹으로 테이블을 때리는 것입니다. 그러면 어레이의 보안되지 않은 요소가 공중으로 날아가 무작위로 섞여 빈 어레이 위치로 넘어갑니다.

http://code.google.com/codejam/contest/dashboard?c=975485#s=p3


0

이름은 기억하지 않지만 기본적으로

while Array not sorted

  rearrange the array in a random order

이것은 다른 답변에서 언급 한 bogosort입니다.
— MatrixFrog

0

쉘 정렬

알고리즘 자체가 그다지 모호하지는 않지만 실제로 실제로 사용되는 구현의 이름을 누가 지정할 수 있습니까? 제가 할수 있어요!

TIGCC (TI-89 / 92 / V200 그래프 계산기 용 GCC 기반 컴파일러)는 qsort표준 라이브러리에서 구현을 위해 셸 정렬을 사용 합니다.

__ATTR_LIB_C__ void qsort(void *list, short num_items, short size, compare_t cmp_func)
{
  unsigned short gap,byte_gap,i,j;                
  char *p,*a,*b,temp;                       
  for (gap=((unsigned short)num_items)>>1; gap>0; gap>>=1)    // Yes, this is not a quicksort,
    {                                                         // but works fast enough...    
      byte_gap=gap*(unsigned short)size;
      for(i=byte_gap; i<((unsigned short)num_items)*(unsigned short)size; i+=size)
        for(p=(char*)list+i-byte_gap; p>=(char*)list; p-= byte_gap)
          {
            a=p; b=p+byte_gap;
            if(cmp_func(a,b)<=0) break;
            for(j=size;j;j--)
              temp=*a, *a++=*b, *b++=temp;
          }
    }
}

코드 크기를 작게 유지하기 위해 퀵 정렬을 위해 셸 정렬을 선택했습니다. 점근 적 복잡성이 더 나쁘지만 TI-89는 RAM이 많지 않습니다 (190K, 프로그램 크기 및 아카이브되지 않은 변수의 총 크기). 따라서 항목 수는 낮다.

내가 작성한 프로그램에서 너무 느리다고 불평 한 후에 더 빠른 구현이 작성되었습니다. 어셈블리 최적화와 함께 더 나은 간격 크기를 사용합니다. qsort.c 에서 찾을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.