如何选择最合适的排序算法?

1.排序算法分类

1.1 比较排序:交换排序:基础冒泡排序、优化冒泡排序、基础快速排序、递归版优化快速排序、循环版优化快速排序插入排序:基础插入排序、希尔优化插入排序选择排序:选择排序、二叉堆排序、多叉堆排序归并排序:归并排序

1.2

非比较排序:计数排序桶排序基数排序

2.基础概念解读

2.1 时间复杂度随着排序数据总量n的变大,排序总耗时的上升情况。有五个符号来表示不同的意思:

O(n^2)

大O 表示该排序算法增量情况<= n^2

o(n^2)

小o 表示该排序算法增量情况< n^2

θ(n^2)

希腊字母theta 表示该排序算法增量情况== n^2

ω(n^2)

希腊字母小欧米伽 表示该排序算法增量情况> n^2

Ω(n^2)

希腊字母大欧米伽 表示该排序算法增量情况>= n^2

2.2 稳定性如果a=b,排序前a在b之前,排序后a还在b之前,则稳定如果a=b,排序前a在b之前,排序后a在b之后,则不稳定

2.3 逆序对比如{2, 4, 3, 1}这样一个数列,就有{2, 1},{4, 3},{4, 1},{3, 1}等逆序对,数量为4

3.排序算法对比

4.代码实现(Java)

https://github.com/dawnchengx...

5.伪代码实现

5.1 基础冒泡排序

BasicBubbleSort(A)

    fori=1toA.length-1

        forj=A.lengthdown toi

+ 1

            if

A[j]

< A[j-1]

                exchange A[j]

with A[j-1]

5.2 优化冒泡排序

OptimizeBubbleSort(A)

    fori=1 toA.length-1

        didSwap=false;

        forj=A.lengthdowntoi+1

            if

A[j] < A[j-1]

                exchange A[j]with

A[j-1]

                didExchange=true

        ifdidExchange==true

            return

5.3 基础快速排序

BasicQuickSort(A, p, r)

    if p< r

        q=BasicPartition(A,p, r)

        BasicQuickSort(A,p,

q-1)

        BasicQuickSort(A, q+1, r)


BasicPartition(A, p, r)

    x = A[r]

    i

= p-1

    for

j=p

to r-1

        if

A[j]<= x

            i

= i

+ 1

            exchange A[i]

with A[j]

    exchange A[i+1]

with A[r]

    returni

+ 1

5.4 递归优化快速排序

RecuOptimizeQuickSort(A, sort, end)

    if

start < end

        mid =RecuOptimizePartition(A, start, end)

        RecuOptimizeQuickSort(A, start, mid-1)

        RecuOptimizeQuickSort(A, start+1, end)

RecuOptimizePartition(A, start, end)

    生成介于start和end之间的三个不重复的随机数r1,r2,r3

    取A[r1],A[r2],A[r3]这三个数的中位数,并将该中位数的下标赋值给r0

    x = A[r0]

    i= start -1

    for

j = start to end

- 1

        if

A[j]<= x

            i=i+1

            exchange A[i] with

A[j]

    exchange A[i+1] with

A[end]

    return i+1

5.5 循环优化快速排序

LoopOptimizeQuickSort(A)

    stack = []

    start =0

    end =A.length-1

    stack.push(start)

    stack.push(end)

    whilestack.isNotEmpty()

        end =stack.pop()

        start =stack.pop()

        if start

< end

            base =LoopOptimizePartition(A,start, end)

            //右半边

            stack.push(base+1)

            stack.push(end)

            //左半边

            stack.push(start)

            stack.push(base-1)

LoopOptimizePartition(A, start, end)

    生成介于start和end之间的三个不重复的随机数r1,r2,r3

    取A[r1],A[r2],A[r3]这三个数的中位数,并将该中位数的下标赋值给r0

    x = A[r0]

    i=start

- 1

    for

j = start to end

- 1

        ifA[j] <= x

            i=i+1

            exchange A[i]withA[j]

    exchange A[i+1] with

A[end]

    return

i+1

5.6 基础插入排序

InsertionSort(A)

    for

j=2toA.length

        key = A[j]

        i

= j - 1

        whilei

> 0

and A[i]> key

            A[i+1]

= A[i]

            i

= i

- 1

        A[i+1]= key

5.7 希尔优化插入排序

ShellInsertionSort(A)

    increment =A.length

    do{

        increment = increment/3

+ 1

        forj = increment toA.length

            key= A[j]

            i= j - increment

            while 0<=iandA[i] >key

                A[i+increment] = A[i]

                i=i- increment

            A[i+increment] =key

    }while(1< increment);

5.8 选择排序

SelectionSort(A)

    fori=1

to n-1

        min =i

        for

j=i+1to n

            if

A[min]

> A[j]

                min = j

        exchange A[min]

with A[i]

5.9 二叉堆排序

HeapSort(A)

    BuildMaxHeap(A)

    for i=A.lengthdownto2

        exchangeA[1]

with A[i]

        A.heap-size=A.heap-size

- 1

        MaxHeapify(A,1)

BuildMaxHeap(A)

    A.heap-size=A.length

    for i=A.length/2downto1

        MaxHeapify(A,i)

MaxHeapify(A,i)

    l = LEFT(i)

    r = RIGHT(i)

    if

l <= a.heap-size

and A[l]

> A[i]

        largest = l

    else

largest = i

    ifr <=A.heap-size

and A[r]

> A[largest]

        largest = r

    iflargest !=i

        exchange A[i]

with A[largest]

        MaxHeapify(A, largest)

LEFT(i)

    return2i

RIGHT(i)

    return2i+1

5.10 多叉堆排序

5.11

归并排序

MergeSort(A, p, r)

    if p< r

        q= (p+r)/2

(向下取整)

        MergeSort(A,p, q)

        MergeSort(A, q+1, r)

        Merge(A,p, q, r)

Merge(A, p, q, r)

    n1 =q

- p

+ 1

    n2 = r -q

    let L[1..n1+1]

and R[1..n2

+ 1]be new arrays

    for i

= 1to n1

        L[i]=A[p +i- 1]

    for

j = 1to n2

        R[j]=A[q

+ j]

    L[n1+1]

= 正无穷大

    R[n2+1]

= 正无穷大

    i

= 1

    j =1

    for

k = pto r

        if

L[i]

<= R[j]

            A[k]

= L[i]

            i

= i

+ 1

        else

            A[k]

= R[j]

            j = j +1

5.12 计数排序

CountingSort(A, B, k)

    letC[0...k]

be anew array

    for i

= 0to k

        C[i]

= 0

    for

j = 1toA.length

        C[A[j]]

= C[A[j]]

+ 1

    for i

= 1to k

        C[i]

= C[i]

+ C[i-1]

    forj =A.lengthdownto1

        B[C[A[j]]]

= A[j]

        C[A[j]]

= C[A[j]]

- 1       

5.13 基数排序

https://www.jianshu.com/p/68b...

5.14

桶排序

https://www.cnblogs.com/zer0Black/p/6169858.html

BucketSort(A)

    n =A.length

    letB[0..

n-1]

be anew array

    for i

= 0

to n-1

        make B[i]an empty list

    for i

= 1to n

        insert A[i]

into list B[]

    for i

= 0

to n-1

        sort list B[i]with insertion sort

    concatenate the lists B[0],B[1],...,B[n-1]

together in order

排序算法

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,386评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,142评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,704评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,702评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,716评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,573评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,314评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,230评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,680评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,873评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,991评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,706评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,329评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,910评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,038评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,158评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,941评论 2 355

推荐阅读更多精彩内容

  • 总结一下常见的排序算法。 排序分内排序和外排序。内排序:指在排序期间数据对象全部存放在内存的排序。外排序:指在排序...
    jiangliang阅读 1,346评论 0 1
  • 归并排序和快速排序用的都是分治的思想,用递归的编程技巧来实现.咱们先来看归并排序. 归并排序 归并排序的核心思想就...
    我是码神阅读 1,373评论 0 0
  • C语言经典例程100例 这篇文章主要介绍了C语言经典例程100例,经典c程序100例,学习c语言的朋友可以参考一下...
    縸_3354阅读 345评论 0 0
  • 快速排序 简介 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange so...
    BlackMammba阅读 635评论 0 0
  • 数据结构&算法 1.数据结构的存储一般常用的有几种?各有什么特点? 在计算机中,数据的存储结构可以采取如下四中方法...
    哈库呐玛塔塔__阅读 263评论 0 0