简单选择排序
其思想是:每一趟从待排序的数据元素中选择最小(或最大)的一个元素作为首元素,直到所有元素排完为止.(与当前数字交换最大或最小数字)
完整记录:60,71,49, 11,24,3,66
如:假设已经排序的序列:3,11,24
当前的记录:3,11,24,71,49,60,66
待排序的记录:71,49,60,66
选出最小的记录49,交换49和当前待排序的记录的第一个元素71。
则:已经排序的序列:3,11,24,49
当前的记录:3,11,24,49,71,60,66
待排序的记录:71,60,66
Javascript代码:
function selectionSort(arr){
var key_index;
for(var i=0;i<arr.length;i++){
key_index=i;
for(var j=i;j<arr.length;j++){
if(arr[j]<arr[key_index])
key_index=j;
}
if(key_index!=i)
[arr[i],arr[key_index]]=[arr[key_index],arr[i]];
}
console.log(arr);
}
时间复杂度:无论最好和最坏的情况下,都是O(n2),故平均时间复杂度是O(n2)。简单选择排序是不稳定排序。如序列5 8 5 2 9,我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了。
简单插入排序:
其思想是:每步将一个待排序的记录,按其值的大小插入前面已经排序的序列中适当位置上,直到全部插入完为止。(下文采用交换法:始终移动当前需要插入的值;也可采用插入法删除当前需要插入的值,直接插入到当前位置)
完整记录:60,71,49, 11,24,3,66
如:假设已经排序的序列:49,60,71
当前的记录:49,60,71, 11,24,3,66
待排序的记录:11,24,3,66
待插入的记录:11
依次比较11与71、60、49的大小,找到11应该插入的位置,若不是,则将相应的数字往后移动(这里用交换两个数字来实现);若是,则插入。
则:已经排序的序列:11,49,60,71
当前的记录:11,49,60,71, 24,3,66
待排序的记录:24,3,66
待插入的记录:24
Javascript实现代码:
function insertionSort(arr){
var len=arr.length;
for(var i=1;i<len;i++){
for(var j=i;j>0&&arr[j]<arr[j-1];j--){
[arr[j],arr[j-1]]=[arr[j-1],arr[j]];
}
}
console.log(arr);
}
简单插入排序在最好情况下,需要比较n-1次,时间复杂度为O(n);在最坏情况下,时间复杂度依然为O(n2),平均时间复杂度是O(n2)。由于交换的步骤仅发生在相邻的两个数之间,加之“<”才交换,因此插入排序的算法是稳定的。
冒泡排序:
其思想是:对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟会将最小或最大的元素“浮”到顶端,最终达到完全有序。(始终移动最大或最小的一个)
Javascript代码:
function bubbleSort(arr){
for(var i=0;i<arr.length;i++){
for(var j=1;j<arr.length-i;j++){
if(arr[j]<arr[j-1]){
[arr[j],arr[j-1]]=[arr[j-1],arr[j]];
}
}
}
console.log(arr);
}
最好情况下,时间复杂度为O(n);在最坏情况下,时间复杂度依然为O(n2),平均时间复杂度是O(n2)。由于交换的步骤仅发生在相邻的两个数之间,加之“<”才交换,因此插入排序的算法是稳定的