O (n) 의 정렬 알고리즘 - (계수 정렬, 통 정렬 및 js 구현)

3863 단어 데이터 구조
  • 요약 하면 흔히 볼 수 있 는 시간 복잡 도 는 O (n) 의 정렬 알고리즘 이 고 js 실현
  • 을 제시 합 니 다.
  • 비교 정렬 이 아니 라 비교 정렬 의 시간 복잡 도 하 계 는 O (n * logn)
  • 이다.
    계수 정렬 (Counting sort)
  • 적용 범위: 대기 배열 배열 arr [N], 요 소 는 특정한 범위 [min, max]
  • 에 있 습 니 다.
  • 핵심: 요소 가 정수 이 고 공간 이 시간 을 바 꾸 려 면 공간 크기 가 O (max - min) 인 공간 이 필요 하 다 고 가정 하여 모든 요소 가 나타 난 횟수 를 저장 해 야 한다.
  • 원소 의 개수 가 많 지만 수치 범위 가 좁 을 때 계수 순 서 는 공간 을 절약 할 수 있다
  • 절차:
  • arr [N] 을 옮 겨 다 니 며 계수 배열 count [max - min] 를 사용 하여 각 요 소 를 계수 합 니 다
  • 옮 겨 다 니 기 count [], arr [N] 복원, 종료
  • 보충: 배열 index 는 반드시 ≥ 0 이 고 배열 을 기다 리 는 요소 의 min 은 반드시 0 이 아니 므 로 하나의 offset 을 도입 하여 수치 가 배열 count [] 에서 의 위 치 를 수정 해 야 한다
  • .
    function countSort(nums) {
        if (nums.length <= 1) return;
    
        let max = nums[0];
        let min = nums[0];
        for (let i = 1; i < nums.length; i++) {
            max = nums[i] <= max ? max : nums[i];
            min = nums[i] >= min ? min : nums[i];
        }
    
        //      
        let offset = 0 - min;
    
        //        
        let count = new Array(max - min + 1);
        for (let i = 0; i < count.length; i++) count[i] = 0;
    
        //   :         
        for (let i = 0; i < nums.length; i++) {
            count[nums[i] + offset]++;
        }
    
        //       
        let index = 0;
        for (let i = 0; i < count.length; i++) {
            while (count[i] > 0) {
                nums[index] = i - offset;
                index++;
                count[i]--;
            }
        }
    }
    

    통 정렬 (Bucket sort)
  • 적용 범위: 대기 배열 A [N], 요 소 는 특정한 범위 [min, max]
  • 에 골 고루 분포 한다.
  • 핵심: 요소 가 균일 하 게 분포 된다 고 가정 한다.
  • 평균 시간 복잡 도 는 O (n) 이 고 최 악의 경우 모든 데 이 터 는 한 통 안에 있 으 며 그 시간 복잡 도 는 통 안의 요소 가 스스로 정렬 하 는 알고리즘
  • 에 달 려 있다.
  • 데이터 가 균일 한 분포 에 복종 하지 않 더 라 도 데 이 터 를 입력 하여 다음 과 같은 성질 을 만족 시 키 면 모든 통 의 크기 의 제곱 과 전체적인 요 소 는 선형 관 계 를 나타 내 고 통 배열 은 선형 시간 안에 완성 할 수 있다
  • .
  • 필요 한 보조 공간:
  • 통 공간 B
  • 통 안의 요소 링크 공간
  • 절차:
  • A [N], 원소 A [i] 를 옮 겨 다 니 며 해당 하 는 통 X
  • 를 넣는다.
  • A [i] 를 통 X 에 넣 고 통 X 에 약간의 요소 가 있 으 면 안정 적 인 삽입 순 서 를 사용 하여 A [i] 를 통 안의 적당 한 위치 에 놓는다
  • 보충:
  • 통 안의 요 소 는 항상 질서 가 있다.
  • 배럴 의 개수 설정
                    ,       getBucketIndex  ,                 ;
           ,            ,                  
              ,      ,             ,        ,          
             ,         ,      ,           ,             
    
  • //     ,         
    function ListNode(val) {
        this.val = val;
        this.next = null;
    }
    
    // nums    ,     ,     [0,10]   
    // len:    
    function bucketSort(nums, len) {
        console.log(nums, len);
        if (nums.length <= 1) return;
    
        let bucket = [];
        for (let i = 0; i < len; i++) {
            bucket[i] = new ListNode(0);
        }
    
        //       
        for (const num of nums) {
            //            
            let idx = getBucketIndex(num);
            let insertNode = new ListNode(num);
            if (bucket[idx].next == null) {
                //    ,    
                bucket[idx].next = insertNode;
            } else {
                //    ,        
                let pre = bucket[idx];
                let cur = pre.next;
                while (cur != null && cur.val <= num) {
                    pre = cur;
                    cur = cur.next;
                }
    
                insertNode.next = cur;
                pre.next = insertNode;
            }
        }
    
        //       
        let index = 0;
        for (let i = 0; i < len; i++) {
            let node = bucket[i].next;
            if (node == null) continue;
            while (node != null) {
                nums[index] = node.val;
                index++;
                node = node.next;
            }
        }
    }
    
    
    //         
    //      ,        ,       ,             
    function getBucketIndex(num) {
        return parseInt(num);
    }
    
    let array = [2.18, 0.18, 0.16, 2.12, 3.66, 7.88, 7.99, 8.12, 9.66, 5.1, 4.12, 5.28];
    bucketSort(array, 11);
    console.log(array);
    

    좋은 웹페이지 즐겨찾기