Giter VIP home page Giter VIP logo

js-sorting-algorithm's Introduction

十大经典排序算法

Build Status

排序算法是《数据结构与算法》中最基本的算法之一。

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。用一张图概括:

十大经典排序算法 概览截图

关于时间复杂度

  1. 平方阶 (O(n2)) 排序 各类简单排序:直接插入、直接选择和冒泡排序。
  2. 线性对数阶 (O(nlog2n)) 排序 快速排序、堆排序和归并排序;
  3. O(n1+§)) 排序,§ 是介于 0 和 1 之间的常数。 希尔排序
  4. 线性阶 (O(n)) 排序 基数排序,此外还有桶、箱排序。

关于稳定性

稳定的排序算法:冒泡排序、插入排序、归并排序和基数排序。

不是稳定的排序算法:选择排序、快速排序、希尔排序、堆排序。

名词解释

n:数据规模

k:“桶”的个数

In-place:占用常数内存,不占用额外内存

Out-place:占用额外内存

稳定性:排序后 2 个相等键值的顺序和排序之前它们的顺序相同


GitBook 内容大纲

  1. 冒泡排序
  2. 选择排序
  3. 插入排序
  4. 希尔排序
  5. 归并排序
  6. 快速排序
  7. 堆排序
  8. 计数排序
  9. 桶排序
  10. 基数排序

本书内容几乎完全来源于网络。

开源项目地址:https://github.com/hustcc/JS-Sorting-Algorithm,整理人 hustcc

GitBook 在线阅读地址:https://sort.hust.cc/

本项目使用 lint-md 进行中文 Markdown 文件的格式检查,务必在提交 Pr 之前,保证 Markdown 格式正确。

js-sorting-algorithm's People

Contributors

bonfy avatar corningsun avatar gallonyin avatar gitbook-bot avatar goldsunshine avatar hoop208 avatar hustcc avatar juliofeng avatar kkxiaojun avatar lokisharp avatar nchhabra1311 avatar shouao avatar ttttonyhe avatar ty-cs avatar wagnlinzh avatar wilon avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

js-sorting-algorithm's Issues

快速排序的实现方式有优化空间

快速排序的精髓在于“减少swap的次数”,目前的实现代码中,swap次数偏多,不够精简,在GIF动图的演示里也能看出问题。
正确的实现方式可以参考wikipedia,以下是python实现方式的代码:

def quickSort(arr, left=None, right=None):
    left = 0 if not isinstance(left,(int, float)) else left
    right = len(arr)-1 if not isinstance(right,(int, float)) else right
    if left < right:
        partitionIndex = partition(arr, left, right)
        quickSort(arr, left, partitionIndex-1)
        quickSort(arr, partitionIndex+1, right)
    return arr

def partition(arr, left, right):
    pivot = arr[right]
    i, j= left, right - 1
    while True:
        while i<=j and arr[i]<pivot:
            i+=1
        while i<=j and arr[j]>=pivot:
            j-=1
        if i<j:
            swap(arr, i, j)
        else:
            break
    swap(arr, i, right)
    return i

def swap(arr, i, j):
    arr[i], arr[j] = arr[j], arr[i]

c++

请问有c++实现吗?

你好, 谢谢

想抄袭你的素材, 构造一个 C 版本的. 因为变动很大. 可能和你原先不相容.
完全制霸基础排序算法的工程实现技巧.

废话是真鸡儿多

天天想着改进性能,改进个屁呢,冒泡排序谁tm要你考虑输入了,什么时候最快最慢只是用来举例,你tm说非得判断输入是不是有序的,显得你很聪明呗,真是服了,什么垃圾都能出教程

I find something wrong about shell sort with golang

func shellSort(arr []int) []int {
length := len(arr)
gap := 1
for gap < gap/3 {
gap = gap*3 + 1
}
for gap > 0 {
for i := gap; i < length; i++ {
temp := arr[i]
j := i - gap
for j >= 0 && arr[j] > temp {
arr[j+gap] = arr[j]
j -= gap
}
arr[j+gap] = temp
}
gap = gap / 3
}
return arr
}
for gap < gap/3 { =======> for gap < length/3

授权申请

我个人开发了一个微信小程序,起初是做为尝试方便自己查看 GitHub 的开源项目和书籍,但是后续使用人数逐渐增多了。
考虑到小程序上展示的项目都有对应的开源许可,可能会涉及对部分项目的侵权。
我们观察到您的项目并没有在 GitHub 上设置任何的开源许可,所以想向您申请相关的许可,许可包括允许在小程序上展示和查看。
以下是小程序的二维码,可以扫码查看。
qrcode
如果您觉得我已经侵犯了您的权利,请告知我,我将第一时间移除。

From WeChat Mini Programe: GitHub Trending Hub

bubble sort

文中称: 冒泡排序还有一种优化算法,就是立一个 flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用

bubble sort 有两种优化:
文中提到算法:
def bubble_sort(ary):
n = len(ary) #获得数组的长度
for i in range(n):
for j in range(1,n-i):
if ary[j-1] > ary[j] : #如果前者比后者大
ary[j-1],ary[j] = ary[j],ary[j-1] #则交换两者
return ary

两种优化:
#优化1:某一趟遍历如果没有数据交换,则说明已经排好序了,因此不用再进行迭代了。
#用一个标记记录这个状态即可。
def bubble_sort2(ary):
n = len(ary)
for i in range(n):
flag = 1 #标记
for j in range(1,n-i):
if ary[j-1] > ary[j] :
ary[j-1],ary[j] = ary[j],ary[j-1]
flag = 0
if flag : #全排好序了,直接跳出
break
return ary

#优化2:记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序了。

因此通过记录最后发生数据交换的位置就可以确定下次循环的范围了。

def bubble_sort3(ary):
n = len(ary)
k = n #k为循环的范围,初始值n
for i in range(n):
flag = 1
for j in range(1,k): #只遍历到最后交换的位置即可
if ary[j-1] > ary[j] :
ary[j-1],ary[j] = ary[j],ary[j-1]
k = j #记录最后交换的位置
flag = 0
if flag :
break
return ary

授权申请

我个人开发了一个微信小程序,起初是做为尝试方便自己查看 GitHub 的开源项目和书籍,但是后续使用人数逐渐增多了。
考虑到小程序上展示的项目都有对应的开源许可,可能会涉及对部分项目的侵权。
我们观察到您的项目并没有在 GitHub 上设置任何的开源许可,所以想向您申请相关的许可,许可包括允许在小程序上展示和查看。
以下是小程序的二维码,可以扫码查看。
qrcode
如果您觉得我已经侵犯了您的权利,请告知我,我将第一时间移除。

From WeChat Mini Programe: GitHub Trending Hub

计数排序Php代码貌似不准确

计数排序 实例代码

function countingSort($arr, $maxValue = null)
{
    if ($maxValue === null) {
        $maxValue = max($arr);
    }
    for ($m = 0; $m < $maxValue + 1; $m++) {
        $bucket[] = null;
    }

    $arrLen = count($arr);
    for ($i = 0; $i < $arrLen; $i++) {
        if (!array_key_exists($arr[$i], $bucket)) {
            $bucket[$arr[$i]] = 0;
        }
        $bucket[$arr[$i]]++;
    }

    $sortedIndex = 0;
    foreach ($bucket as $key => $len) {
        if ($len !== null) $arr[$sortedIndex++] = $key; //此步将不能确保重复值在原数组中改变位置
    }

    return $arr;
}

注释行应该可以用以下代码替换解决此问题:

if($len !== null){
    for($j = 0; $j < $len; $j++){
        $arr[$sortedIndex++] = $key;
    }
}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.