알고리즘 경험을 정렬

원본 : HTTPS : //www.cnblogs.com/xiaohuiduan/p/11188304.html

열 정렬 알고리즘

기본 정렬 알고리즘 :

  • 선택 정렬
  • 삽입 정렬
  • 버블 정렬

효율적인 정렬 알고리즘 :

  • 빗의 종류
  • 쉘 정렬
  • 빠른 정렬
  • 힙 정렬

공간 절약과 시간을 효율적으로 순서를 희생 :

  • 병합 정렬
  • 기수 정렬
  • 기수 정렬

지금 나는 내 자신의 전망되며 수업은 다양한 대형 온라인 주문 장점과 단점, 시간과 공간의 복잡성 하나님의 분석을 배웠습니다.


기본 정렬 알고리즘

선택 정렬

이유 : 원소의 최소 (또는 최대), 데이터의 나머지 요소의 최소 (또는 최대)을 찾기 위해, 정렬 시작 위치를 유지하도록 배열 발견은 우수한 방출 소자의 뒤에 배치되어있다. 그래서 모든 요소에 분류 될 때까지. (주 : 괄호 안의 다른 경우, 즉 정렬 순서는 내림차순 요소에 대응한다.)

 

공용  정적  INT []를 선택 ( INT A []) {
       INT 분;
        ( INT I = 0; I <a.length; I ++ ) {  = I]
             ( INT J = I + 1]. J <a.length ; J ++ ) {
                IF (a [분] " A [J]) {  = J; 
              } 
// 첫번째 요소가 최소 값의 다음 교환 취출되지 않으면
IF를 ! (최소 = I) { 환 (a , I, J); } } } } 공개 정적 공극 교환기 ( int로 A는 [], int로 난을 INT J) { INT의 온도 = 0 ; 만약 ! (a [I] = A [J] { 온도 = A [i]를, A [I] = A [J], A [J] = 온도; } }

정렬 시간 복잡성을 선택합니다 :

비교 될 수있는 첫 번째 행 N-1 배이며;

가장 작은 요소 방법 첫째, 다음 번에 비교 할 필요가 없습니다. 두번째 비교 필요 N-2 번;

N-3 번을 비교하는 제 필요성

.............

N-1 번 1을 비교해야

총 수 (N-1) + (N-2) + ... + 1 = N (N-1) / 2

사건의 모든 최고의 요소는 필요 0 번 교환에, 주문하고있다.

최악의 경우의 모든 요소가 순서가 스위칭 횟수는 N-1이다.

따라서, 시간 복잡도 : O (N ^ 2)

 

공간 복잡성의 종류를 선택합니다 :

최선의 경우, 정렬 공간적 복잡도의 모든 요소는 O (0)이고;

최악의 경우의 모든 요소가 순서가, 공간 복잡도는 O (n)은이고;

평균 공간 복잡도는 O (1)이다.

선택 종류의 불안정

 

삽입 정렬

이유는 다음의 첫 번째 요소는 두 번째 요소를 스캔 시작 앞뒤로, 순서화 된 배열로 간주 기이고, 규칙적인 배열을 삽입 한 소자는 소자마다 삽입 고려되고있다 1 개 어레이 플러스 시퀀스의 길이. 소자 A는 첫 번째 요소보다 작은 요소가 있다면, 첫 번째 요소, 세 번째 요소 사면의 전면에 배치되는 제 과거보다 크지 않은 경우, 방법은 두 번째 요소에서 스캔 백이고 두 번째 요소보다 첫 번째 요소보다 작지만 작다는 위해서는 모든 요소까지 다음 등이 삽입된다.

예를 들면 :

 

 

 

 코드 구현 :

공용  클래스 Charu는 {
     공개  공극 InsertSort () {
         INT의 TEMP, I, J,
      INT [] A = {38,65,97,76,13,27,49는 }
         위해은 (는 I = 1]. I <a.length; ++ 나 ) {// 인덱스 층 우측은 인덱스 데이터 비교 대상 즉 같이 
            TEMP는 = A [I] 비교에 사용 // 데이터
             의 INT . 인덱스 = -I 1 ,
             그동안 (인덱스> = 0 && A [ 인덱스]> TEMP) {// 데이터 발생보다 왼쪽 또는 작은 온도에 비해, 사이클의 끝 
                이 [인덱스 +1] = A [인덱스] 
                인덱스 - ; 
            } 
            A [인덱스 +1] = 임시 ; 
        } 
        에서 System.out.println (Arrays.toString (a)); 
    } 
    공공  정적  무효 메인 (문자열 []에 args) { 
        
         charu의 C = 새로운 charu (); 
         c.InsertSort (); 
    } 

}

 

삽입 정렬의 시간 복잡도 :

최상의 경우는 모든 요소가 요소보다 큰 엘리먼트를 스캐닝하기 전에 다시 직접 주문, O (N)

최악의 경우 : 요소는 각 스캔해야 스왑 장소, 순서가

첫 번째 요소를 스캔은 먼저 작은 원 소비 비교적 한번 교환 알았다.

두 번째, 세 번째 스캔 소자는, 처음 두 요소를 두 번 비교할 필요보다 작다고되어 제 위치 배열에 삽입된다.

셋째, 3 번 비교

..........

N 번째의 N - 1 소자의 전방에 위치한 N 번째 스캔 소자는 N-1 번을 비교할 필요 배열로 제 위치보다 작다.

1 + 2 + 3 + ..... + N-1 = N (N-1) / 2의 비교 총

시간 복잡도는 O (N ^ 2)

보통의 경우 : O (N ^ 2)

따라서, 시간 복잡도의 삽입 정렬이 O 인 (N ^ 2)

삽입 정렬의 공간 복잡도 :

바람직하게는, 모든 요소의 정렬, O의 공간 복잡도 (1)

모든 요소의 최악의 역순이 공간 복잡도는 O (N)

보통 공간적 복잡도는 O (1)이다.

 삽입 정렬은 안정

 

버블 정렬

기본 원리는 : 작은 그림은 천천히 이동하거나 큰 숫자는 천천히 라운드 사이클의 하단에 침몰의 가장 상단에, 플로트 싱크대 나. 각각의 비교 값 개의 인접한 이전 값이면 교환 양의 값보다 큰 경우, 얻어지는 큰 값이 서서히 마지막에 후방으로 이동된다.

코드 구현

공용  클래스 MaoPao {
     공공  정적  INT [] maopao ( INT [] nums) {
         INT LEN = nums.length;
        경우 (LEN == 0 || LEN == 1 ) {
             복귀 nums; 
        } 
        에 대해 ( INT 난 = 0; I <LEN; I ++ ) {
              ( INT J = 0; J <LEN-I-1; J ++ ) {
                 경우 (nums [J + 1] < nums [J]) {
                     INT의 임시 nums = [J + 1 ]; 
                    nums [J +1 = nums [J]
                    nums [J] =온도; 
                } 
            } 
        } 
        반환 nums을; 
    } 
}
공용  클래스 MaoPao { 
    
    INT의 nums [] = {2,6,7,1,9,4,3 };
    공개  공극 maopao () {
         INT LEN = nums.length;
        경우 (LEN == 0 || LEN == 1 ) {
             ; 
        } 
        에 대해 ( INT 난 = 0; I <LEN; I ++ ) {
              ( INT J = 0; J <LEN-I-1; J ++ ) {
                 경우 (nums [J + 1] < nums [J]) {
                     INT의 임시 nums = [J + 1 ]; 
                    nums [J +1 =  nums [J]
                    nums [J] = 온도; 
                } 
            } 
        } 
        에서 System.out.println (Arrays.toString (nums)); 
    } 
공공  정적  무효 메인 (문자열 []에 args) { 
    MaoPao 마오 = 새로운 MaoPao (); 
    mao.maopao (); 
  } 
}
코드보기

 

버블 정렬 시간 복잡도 :

최악의 경우 : 우리가 큰 배열에 작은에서 원하는는, 사전에 작은 알 수없는 큰

첫번째 원은 최소 어레이의 제 위치로 이동되고, 숫자는 N-1과 비교하는 단계;

두 번째 라운드 후에, 2 피니언이 제 1 위치로 이동 번호는 번호 N-2와 비교하는 단계;

..........

n 륜이 최대 번호 끝에서 두 번째 소수 전방 이동이 비교 될 수는 하나이다.

비교 될 총 수이다 (N-1) + (N-2) + ....... + 1 = N (N-1) / 2.

따라서, O의 최악의 경우의 시간 복잡도 (N ^ 2).

최저 : 큰 작은에서 줄 지어 질서의 모든 요소는, N-1 비교를 할. 시간 복잡도는 O (N)이다.

평균 시간 복잡도는 O (N ^ 2)이다.

버블 정렬 안정적인 정렬 알고리즘이다.


 

 

 

효율적인 정렬 알고리즘 

빠른 정렬

이유 : 어레이 (일반적으로 최초의 번호)에 숫자를 선택은 그것의 전면에 배치 된 수보다 작고, 이보다 큰 숫자 뒤에 넣어 서로 숫자와 비교 하였다 배열은 두 부분으로 나누어 져 후 큰보다는 미래의 수보다 그 적은 수의 앞으로이 부문에 대해 선택된 번호로 시작 넣어, 다음이 두 부분이 정렬 알고리즘 재귀했다, 우리는 일종의에게 전체 배열을 얻을 수 있습니다.

 상세 공정 : 제 번호 배열의 참조 번호이고, 두 가드, 참조 번호보다 작은 수 찾기 위해 오른쪽으로 이동 오른쪽하자 (어레이 요소 엔드 포인팅) 오른쪽 (어레이의 첫 번째 요소를 가리키는)과 좌측 및 정지 그 다음 참조 번호가 다수 발견하고, 정지 디지털 좌 디지털 권리 교환의 의미에서 언급하는 것보다 왼쪽으로 이동하려면 왼쪽 (동일한 우선 오른쪽 움직임이다)으로 이동하는 것을 계속한다. 그 때 요소 오른쪽 = 왼쪽 보초 때 두 대회, 정지 이동, 교환의 기준 요소 번호의 만남의 장소의 피할 수없는 요소 "원점"의 시작 부분에 이러한 기준의 수를 왼쪽의 오른쪽에, 참조 번호보다 낮은 참조 번호보다 필연적으로 크다. 재귀 호출, 오른쪽에있는 "후 귀환"의 왼쪽 요소에 대한 벤치 마크로서 첫 번째 요소로 새로운 배열, 위의 단계를 반복합니다. 순서의 모든 요소까지.

코드 구현 :

패키지 suanfa는, 

공용  클래스 KuaiSuPai는 {
     공공  정적  무효 퀵 ( INT [] ARR는 INT는 왼쪽 INT 오른쪽) {
         INT는 I가 J, TEMP, T;
         IF (왼쪽> 오른쪽)
             , 
        TEMP는 = ARR [왼쪽]을; // 참조 번호는 임시 저장된 
        I는 = , 왼쪽 
        J = 오른쪽,
         그동안은 (! I가 = {J)
             // 순서 취할 권리 찾는 것이 중요하다 
            그동안 (ARR을 [J]> 온도 = && I < J) 
                J를- ;
             // 찾을 좌우 그로부터 
            그동안을 (ARR [I]가 <= TEMP && I은 < J) 
                I ++ ; 
            
            // 배열에서 과거 2 위 
            IF (I <J)가 // 센티넬을 i와 j가 시간에 맞지 않는 
            { 
                T = ; ARR [I] 
                ARR [I] = ARR [J] 
                ARR [J] = T를; 
            } 
        } 
        // 최종적으로 참조 번호 호밍 
        ARR [좌측] = ARR [I] ; 
        ARR [I] = TEMP; 
        
        퀵 (ARR, 왼쪽 I -1 ), 
        퀵 (ARR, I+1 , 오른쪽),
         ; 
    } 
    공공  정적  무효 메인 (문자열 []에 args) {
         INT [] = {10,7,2,4,7,62,3,4,2,1,8,9 ARR, . 19 } 
        퀵 (ARR, 0 ,. 1 arr.length) // 호 퀵 바로 우측의 번호 = 0을 남은 
        위해 ( INT I = 0; I <arr.length; I ++ ) { 
            System.out에 .println (ARR [I]); 
        } 
    } 

}

 

빠른 정렬의 시간 복잡도 :

최상의 경우 : 정렬 된 요소

시간 재귀 알고리즘 복잡도 식 : T [N] AT = [N / (B)] + F (N);

제 재귀 차례 비교 : T [N] = 2T [N / 2] + N   

비교 제 재귀 번호 : 순서가 N = N / 2는 2 ^ 2 T [N / (2 ^ 2)] + 2N을주는 식에 대입

 셋째 재귀 비교 시간 : 2 ^ 3 T [N / (2 ^ 3)] + 3N

.............

그래서 : N = N / (2 ^ (m-1)) = 2 ^ m의 T [1] m 번째 재귀 + MN ---------------- 단부 (m 시간 후 )

               마지막 듀스를 균등하게 분배 할 수없는 경우, 수식 낙하되었는지 마지막 T [1]을 얻기 위해, 그것은 (T [1]는 상수)이 식을 통해 반복되는 것을 나타낸다.

               구하는 방법 T [N / (2 ^ m) = T를 [1] >> === N = 2 ^ m ==== >> m = logn;

               T [N] = 2 ^ m의 T [1] + MN; 상기 m = logn;

               상기 N 개의 요소의 수이고; T [N] = 2 ^ (logn) T [1] + T nlogn = N [1] + = N + nlogn nlogn

               2 인해 때 N> = nlogn> = N (즉 logn> 1)이므로 후자 테이크 nlogn 그;

               요약하면 : 빠른 정렬 최적의 케이스의 다음 시간 복잡도 : O (nlogn)을

계산 출처 : HTTPS : //blog.csdn.net/A_BlackMoon/article/details/81064712

 최악의 시간 복잡도 : O (N ^ 2)

 최악의 상황이 실제로 거품 정렬 (마다 행 좋은 시퀀스 소자)이고, 어레이의 모든 요소가 최소 / 최대가 걸릴 것입니다

     계산이 경우 시간 복잡도, 버블 정렬 시간 복잡성 같이 : T [N] = N * (N-1) = N + 2 ^ N;

 

 

힙 정렬 :

 힙 정렬의 기본 원리 : 랜덤 순서는 필요에 따라 크고 작은 상위 스택 최상부 오름차순 내림차순 스택을 선택 스택을 구축 하였다. 마지막에 적층 소자 및 스위칭 소자의 상단은, 가장 큰 요소는 배열의 마지막에 가라 앉는다. 정비 스택 구조의 정의를 충족하고 교환 소자와 소자의 스택의 현재 최상위의 끝까지 계속해서, 조정은 반복 명령들의 전체 시퀀스까지 + 교환하는 단계를 실행한다.

코드 구현

 

말뚝 작은 힙의 상단의 상단 사이의 차이를 이해

 

 

추천

출처www.cnblogs.com/hjdk05/p/11968501.html