JavaScript общих сортировочные идеи алгоритма и реализация коды

Bubble Сортировка

Для сравнения и обмена соседних элементов, каждый проход , так что цикл не может найти максимум или минимум отсортированного массива.
Лучше всего: O(n)нужен только один массив пузырьков на заказ.
Худший: O (n²)
Средний балл: O (n²)

* Single пузырь

  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²)
Среднее: О (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 минут), а затем продолжить рекурсивно последовательности оснований с обеих сторон слева и справа.

Предпочтительно: О (п * LOGN), все числа , равномерно распределенные по обеим сторонам основания, на этот раз константы о рекурсивной двоичной последовательности.
Худший: O (N²), все номера расположены на одной стороне основания, на этот раз последовательность является эквивалентом приблизительно делят вставки рода.
Средний балл: О (п * LOGN)

  • Быстрый вид заливного отверстия

С нужное время после того, продвигаясь к середине встречается несколько меньше, чем база будет назначен слева (начало является расположение базы), право на сохранение первоначальной стоимости и т.д. оставлены для заполнения значений

Подсчет Сортировка

Элемент массива является ключевым, так как количество вхождений значения, осажденным во временный массив, и, наконец, пройти через временный массив для возврата к исходному массиву. Поскольку массивы являются стандартными строками, хранящиеся в JavaScript, поэтому устройство может быть использовано для подсчета негативного рода, но не выровнены знаков после запятой.

Предпочтительно: О (п + к), к представляет собой разность между максимальным и минимальным значениями.
Худшие: О (п + к)
Среднее: О (п + к)

 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 приращения. Хилл сортировки аналогично для вставки последовательности, лишь несколько шагов, начиная с движения вперед в зазор.

Предпочтительно: О (п * 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