冒泡排序
// 冒泡排序
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)个元素插入到前面的序列中,保证有序。**循环插入所有元素,即完成排序。
四、归并排序
归并的基本思想是合并多路有序数组,通常我们考虑两路归并算法。
五、快速排序
快速排序的基本思想是分治。 快排是不稳定的,关键在于划分过程。
六、堆排序
堆排序的基本思想是对序列建立最小堆,然后依次取堆顶元素、删除和调整堆。