冒泡排序
定义:相邻数对大小互换位置,循环对比两层完成
冒泡排序:
img
js sort()方法的原理: 冒泡排序法。
function BubbleSort(nums) {
let temp = 0
for(let i = 0; i<nums.length; i++){
for(let j = 0; j<nums.length; j++){
if(nums[j]>nums[j+1]){
temp = nums[j]
nums[j] = nums[j+1]
nums[j+1] = temp
}
}
}
return nums
}
let nums = [2,4,3,5,1]
console.log(BubbleSort(nums))
力扣题目: 179. 最大数
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
输入:nums = [10,2]
输出:"210"
解题思路:先将数据排序,排序的时候比较的不是俩个数的大小 而是比组合的大小 就是比较 102 与210的大小!
var largestNumber = function(nums) {
nums.sort((a,b)=>{
let sa = 10,sb = 10
while(sa<=a){
sa*=10
}
while(sb<=b){
sb*=10
}
console.log(a,b,sa,sb)
return (b*sa+a)-(a*sb+b)
})
return nums.join('')
};
console.log(largestNumber([3,30]))
力扣题目:324.摆动排序 II
给你一个整数数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。
你可以假设所有输入数组都可以得到满足题目要求的结果。
示例 1:
输入:nums = [1,5,1,1,6,4] 输出:[1,6,1,5,1,4] 解释:[1,4,1,5,1,6] 同样是符合题目要求的结果,可以被判题程序接受。
解题思路:
1.传统的方法将数组排序,将大的数字插入到晓得数字里面。 对于数组[1,1,2,2,3,3],分割为[1,1,2]和[2,3,3]。小的数组大于等于小数组的个数。为避免[1,1,2,2,2,3],分割为[1,1,2]和[2,2,3],最终结果为[1,2,1,2,2,3]的情况,我们将切割后的数组反序。再穿插但是这样的时间复杂度:O(NlogN),空间复杂度为O(N)。
2.解法2:快速选择 + 3-way-partition
var wiggleSort = function(nums) {
nums.sort((a,b)=>{
return a-b
})
let len = nums.length-1
let tmp = new Array(len)
for(let i=1;i<nums.length;i+=2){
tmp[i] = nums[len]
len--
}
for(let j=0;j<nums.length;j+=2){
tmp[j] = nums[len]
len--
}
return tmp
};
let nums = [1,3,2,2,3,1]
console.log(wiggleSort(nums))
选择排序
定义:选择排序是最直观的排序,通过确认一个key最大或最小值,再和其他数中找到最大/小的值交换到对就位置
算法实现:
- 确认比较值:默认第一个
- 找到最小数:找到剩余数中比比较值小的数
- 位置替换: 把找到的最小值替换到比较值的位置
- 重复步骤: 二层循环
img
var changSort = function(nums) {
let temp = 0
for(let i=0; i<nums.length; i++){
for(let j=i+1; j<nums.length; j++){
if(nums[j]<nums[i]){
temp = nums[j]
nums [j] = nums[i]
nums[i] = temp
}
}
}
return nums
};
let nums = [8,5,1,9,6,4]
console.log(changSort(nums))
快速排序
定义:通过一趟排序将待排序记录分隔成独立的两部分,其中一部分记录的数据均比另一部分的数据小,则可分别对这两部分记录继续进行排序,以达到整个序列有序;
算法实现:
- 确认基准:从数列中挑出一个元素,称为‘基准’(pivot)
- 分区操作:小于基准放前,大于基于放后,完成后,基准就位于中间位置
- 递归操作(确认基准->分区操作) :重复上面操作步骤
img
function quickSort(arr) {
if (arr.length <= 1) {
return arr
}
let pivotIndex = Math.floor(arr.length / 2)
let pivot = arr.splice(pivotIndex, 1)[0]
console.log(pivotIndex,pivot)
console.log(arr)
let left = []
let right = []
for (let i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
// 递归
return quickSort(left).concat([pivot], quickSort(right))
}
let nums = [8,5,1,9,6,4]
result = quickSort(nums)
console.log(result)