자바 스크립트 일반적인 정렬 알고리즘의 아이디어와 코드 구현

버블 정렬

비교 인접한 요소의 교환에 의해, 각각의주기가 정렬 된 배열의 최대 값 또는 최소값을 발견 할 수 있도록 통과.
최저 : O(n)순서만을 하나 거품 배열이 필요합니다.
최악의 : O (n²)
평균 : O (n²)

* 단일 거품

  function bubbleSort(nums) {
        for (let i=0 , len=nums.length; i<len-1; i++) {
          //如果一轮比较中没有需要交换的数据,则说明数组已经有序,主要是为了对[5,1,2,3,4]之类的数组进行优化。
            let mark = true;
            for (let j = 0; j < len-i-1; i++) {
                if (nums[j] > nums[j+1]) {
                    [nums[j],nums[j+1]] = [nums[j+1],nums[j]]
                    mark = false
                }
            }
            if (mark) return nums
        }
    }

양방향 거품

여행에서 일반 거품 정렬 루프는 최대 또는 최소를 찾기 위해, 양방향 거품은 하나 개 이상의주기는 또한 최소 값을 찾을 수있는 최대 값을 찾는 것입니다

     function bubbleSort_twoWays(nums) {
            let low = 0
            let high = nums.length - 1
            while(low < high) {
                let mark = true
                // 找到最大值放到到右边
                for (let i=low; i<high; i++) {
                    if(nums[i] > nums[i+1]) {
                        [nums[i],nums[i+1]] = [nums[i+1],nums[i]]
                        mark = false
                    }
                }
                high--
                // 找到最小值放到左边
                for(let j=high;j>low;j--) {
                    if(nums[j] < nums[j-1]) {
                        [nums[j],nums[j-1]] = [nums[j-1],nums[j]]
                        mark = false
                    }
                }
                low++
                if(mark) return nums
            }
        }

선택 정렬

정렬 소자와 그 이후의 비교 및 ​​교환 가능한 요소들의 각각을 선택한 것을 제외하고는, 거품 정렬은 유사하다.

바람직 : O (n²)
최악 : O (n²)
평균 : O (n²)

 function selectSort(nums) {
            for (let i = 0, len = nums.length; i < len; i++) {
                for (let j = i + 1; j < len; j++) {
                    if (nums[i] > nums[j]) {
                        [nums[i], nums[j]] = [nums[j], nums[i]]
                    }
                }
            }
            return nums
        }

삽입 정렬
순서 배열로서, 후속 요소들에 의해 첫 번째 요소는 어레이 내의 적절한 위치 정렬 삽입 된 발견.

최고 : O(n)원래의 배열은 이미 오름차순입니다.
최악의 : O(n²)
평균 :O(n²)

function insertSort(nums) {
            for (let i = 1,len = nums.length;i < len; i++) {
                let temp = nums[i]
                let j = i
                while (j >= 0 && temp < nums[j-1]) {
                    nums[j] = nums[j-1]
                    j--
                }
                nums[j] = temp
            }
            return nums
        }

빠른 정렬

베이스 (일반적으로 첫 번째 요소), 상기베이스 부재는 그 오른쪽 (22분 상당)에베이스 부재보다 큰, 그것에 왼쪽보다 작은 등의 요소를 선택하고, 좌우의 양측에 재귀 적 염기 서열을 계속한다.

바람직 : O (logn N *)을 균일하게 기재의 양면에 분산 된 모든 수는 일정 시간이 재귀 이진 시퀀스에 관한 것이다.
최악 : O (n²)가 모든 숫자베이스의 일측에 위치되며,이 때 서열은 약 분할 삽입 정렬에 상응한다.
평균 : O (n 개 *의 logn)

  • 주입구의 빠른 종류

정시부터 중앙까지 진행 한 후 기지국에 비해 적은 (초기에는 염기의 위치)의 왼쪽에 할당 될 숫자 등 원래의 값을 유지하는 권리가 값을 입력하기 위해 남아있는 조우

정렬 계산

어레이 요소는 임시 배열로 증착 값의 발생 횟수로, 키, 그리고 최종적으로 다시 원래의 배열로 되돌릴 임시 배열을 통과. 배열은 자바 스크립트에 저장된 표준 문자열, 그래서 때문에 배열은 음의 종류를 계산하는 데 사용하지만, 소수를 정렬 할 수는 없습니다.

바람직 : O는 (N + K), K는 최대 값과 최소값의 차이이다.
(N + K) O : 최악의
평균 : O (N + K)

 function countingSort(nums) {
            let arr = []
            let max = Math.max(...nums)
            let min = Math.min(...nums)
            // 装桶
            for (let i=0, len=nums.length; i<len; i++) {
                let temp = nums[i]
                arr[temp] = arr[temp] + 1 || 1
            }
            let index = 0
            //还原数组
            for (let i=min; i<=max; i++) {
                while(arr[i]>0) {
                    nums[index++] = i
                    arr[i]--
                }
            }
            return nums
        }

쉘 정렬

약간 증가하여 GAP은 전체 시퀀스 그룹으로 분할하고, 후면에서 그룹 스위칭 부재를 비교 한 후 서서히 증가 1로 감소된다. 시퀀싱을 삽입 유사 정렬 힐, 간격으로 전진부터 시작하여 불과 몇 걸음.

바람직 : O (n 개 *의 logn), 두 단계로 진행.
최악의 : O (N * logn)
평균 : O (N * logn)


        function shellSort(nums) {
            let len = nums.length
            // 初始步数
            let gap = parseInt(len / 2)
            // 逐渐缩小步数
            while (gap) {
                // 从第gap个元素开始遍历
                for (let i = gap; i < len; i++) {
                    //逐步和前面其他成员进行比较和交换
                    for (let j = i - gap; j >= 0; j -= gap) {
                        if (nums[j] > nums[j + gap]) {
                            [nums[j], nums[j + gap]] = [nums[j + gap], nums[j]]
                        } else {
                            break
                        }
                    }
                }
                gap = parseInt(gap / 2)
            }
            return nums
        }

원본 링크 : HTTPS : //mp.weixin.qq.com/s/Rl_fcWzcSQ7NkPnozIrt0A

추천

출처www.cnblogs.com/yuanchao-blog/p/10990628.html