冒泡排序
冒泡排序的实质就是将数组的相邻项进行比对,如果前一个比后一个大,就交换位置。
冒泡排序需要两层的循环,第一层循环负责比对的轮次,第二层负责相邻位置对比的次数。
比如一个最坏情况的数组为 arr = [4,3,2,1],按照从小到大排序:
第一轮交换的过程依次为:[3,4,2,1]、[3,2,4,1]、[3,2,1,4]
第二轮交换的过程依次为:[2,3,1,4]、[2,1,3,4]
第三轮交换的过程依次为:[1,2,3,4]
可以发现一个规律,比较次数+当次轮数 = 数组的长度
代码如下:
function bubbleSort (arr){
let length = arr.length
for(let i = 0 ; i arr[j+1]){
temp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = temp
}
}
}
return arr
}
冒泡排序的比较次数可以依次推倒为:
比如4个数字的排序,第一轮比较3次,第二轮比较2次,第三轮比较1次
比较总次数为:3+2+1
n个数字,比较次数为 (n-1)+(n-2)+ …… + 1 = n*(n-1)/2
去除常项只保留最高阶项
比较次数为:O( n² )
冒泡排序的交换次数:
假定两次比较会交换一次,取一个平均值,为n*(n-1)/2 /2
去除常项只保留最高阶项
交换次数为:O( n² )
选择排序
选择排序的实质:
第一步,设置一个min最小索引值,一般从0开始
第二步,arr[min]和未排序项进行比对,把比arr[min]小的项的索引值,改为新的最小索引值
第三步,将新的最小索引值的位置和未排序的起始位置进行交换,重复以上过程
function selectionSort(arr){
let temp , min = 0
for( let j = 0 ; j< arr.length ; i++){
for( let i = min + 1 ; i < arr.length ; i++ ){
if( arr[min] > arr[i] ){
min = i
}
}
temp = arr[min]
arr[min] = arr[0]
arr[0] = temp
}
}
选择排序的比较次数O(n²)
//代码效果参考:http://www.zidongmutanji.com/bxxx/537562.html
选择排序的交换次数O(n)
插入排序
插入排序就像在打扑克牌,欢乐斗地主,按照从小到到从左到右的顺序将牌进行排列。
在一个无序的序列中,先把第一个元素当做已排序序列,剩余当做未排序序列。
然后遍历未排序的序列,依次和第一个元素进行比对。如果元素较小,就将其移至前方。这里可以使用while循环。
function insertSort(arr){
for(let i = 1;i0){
arr[j] = arr[j-1]
j--
}
arr[j]=temp
}
return arr
}
插入排序最多的比较次数为:(1+2+...+N-1)/2 = N*(N-1)/4
插入排序的复制次数:N*(N-1)/4
时间复杂度为O(n²)