1.冒泡排序
思路
假设该排序要求升序排列
首先使用一个for循环将数组进行遍历,然后在for循环中嵌套一个for循环每次拿两个数字nums[j]和nums[j+1]进行比较,如果nums[j]>nums[j+1],则将二者交换位置,将大的数字进行不断后移,这样每次最大的数字都可以排列到最后,慢慢该数组就升序排列了。
var sortColors = function(nums) {
if(nums.length == 0) return nums
//冒泡排序
for(let i = 0; i < nums.length; i++) {
for(let j = 0; j < nums.length - i; j++) {
let temp
if(nums[j] > nums[j+1]) {
temp = nums[j]
nums[j] = nums[j+1]
nums[j+1] = temp
}
}
}
return nums
};
2.选择排序
思路
假设也是升序排序
选择排序和冒泡排序不同的就是,每次循环中找到最小的数字然后将该数字移到最前面,选择排序其实也是冒泡排序的优化。
var sortArray = function(nums) {
if(!nums.length) return nums
for(let i = 0; i < nums.length; i++) {
//定义变量保存最小数字的索引
let index = i
//因为j每次从i开始遍历的,每次找到的最小数字移动到数组最前面后就不会继续遍历该数字了
for(let j = i; j < nums.length; j++) {
//本次循环结束后就可以得到最小数字的索引值
if(nums[j] < nums[index]) {
index = j
}
}
//拿到最小数字后,将该数字移到数组的最前面
let temp = nums[index]
nums[index] = nums[i]
nums[i] = temp
}
return nums
};
3.插入排序
思路
假设是升序排序
比较前两个数字的大小使得较小的数在前面,目前已排序好的数据有两个数字称之为ascArr
第三个数字curVal首先和ascArr的最后一个数字bigNum比较,如果curVal<bigNum,则将bigNum后移一位,然后继续比较curVal和ascArr的倒数第二个数,这样又可以得到一个有序的数组。以此类推,就可以得到一个升序的数组。
var sortArray = function(nums) {
if(!nums.length) return nums
//如果i < nums.length作为临界条件的话,假设length为4,则在最后一次循环时nums[3+1]就取不到了
for(let i = 0; i < nums.length-1; i++) {
let curVal //当前待排序的元素
let preIndex = i //已经排序好的元素索引
curVal = nums[preIndex + 1]
while(preIndex >= 0 && curVal < nums[preIndex]) {
nums[preIndex+1] = nums[preIndex]
preIndex--
}
//因为在while循环中已经被--过一次,需要加+1才可以得到对应需要插入的位置
nums[preIndex+1] = curVal
}
return nums
};