常见排序算法(手写系列)

660 阅读2分钟

冒泡排序

// 冒泡排序
bubbleSort(arr) {  
    var len = arr.length;
    for (var i = 0; i < len; i++) {
        for (var j = 0; j < len - 1 - i; j++) {
          if ( arr[j] > arr[j+1] ) {//相邻元素两两对比
             var temp = arr[j+1];        //元素交换
             arr[j+1] = arr[j];
             arr[j] = temp;
          }
        }
    }
    return arr;
}
//备注:1-10需要比较次数1+2+3+...+9=45

深入学习排序算法之稳定性、比较次数、交换次数探讨

一、冒泡排序

冒泡排序的原理是将相邻元素比较,小的往左移动,大的往右,整个过程就像是水中气泡上浮。

在相邻两个元素的比较中,如果相等,则没有必要交换。这一点,保证了冒泡排序的稳定性

对于n个元素,相邻元素均要比较,共有**(n-1)次,依次类推,其他比较次数为(n-3),......,2,1.,所以总共比较次数为n(n-1)/2**

至于交换次数,这个取决于初始序列的逆序数

对于数组A[1,...,n],如果对于i<j有A[i]>A[j],则称(A[i],A[j])是一个逆序对,序列中逆序对的个数称为逆序数。 冒泡排序每次交换,只改变了相邻两元素的位置,不影响和其他元素之间的逆序关系,因而,逆序数只减1。所以,冒泡排序交换次数等于初始序列的逆序数。

二、选择排序

选择排序的原理是每回合找出最小元素,然后交换到前面位置。

选择排序是不稳定的排序算法,不稳定主要产生于交换。

交换过程可能改变相同元素的相对位置,举个例子,序列(5,8,5,1),最小数是1,第一次交换,得到(1,8,5,5),元素5相对位置已经发生变化。 

下面是比较次数。对于n个元素的序列,找出最小元素需要比较(n-1)次。第一回合后,序列只剩下(n-1)个元素,下一次找最小元素还需要(n-2)次比较。最后直到2个元素需要比较1次。所以最后比较次数总共为(n-1)+(n-2)+...+1=n(n-1)/2,且固定不变

每一回合最多交换一次,有(n-1)回合,所以最多交换次数为(n-1)。

三、插入排序 

**插入排序基本原理是假定前面i个元素已经排好,接下来将第(i+1)个元素插入到前面的序列中,保证有序。**循环插入所有元素,即完成排序。 

四、归并排序

归并的基本思想是合并多路有序数组,通常我们考虑两路归并算法。

五、快速排序 

快速排序的基本思想是分治。 快排是不稳定的,关键在于划分过程。

六、堆排序 

堆排序的基本思想是对序列建立最小堆,然后依次取堆顶元素、删除和调整堆。

参考文章www.cnblogs.com/flyingdream…

blog.csdn.net/dreamer2020…