冒泡排序&选择排序

冒泡排序&选择排序

冒泡排序
从第一个数开始从左往右,它会把相邻的两个数进行比较;
如果左边的数比右边的数大,那么它就会立即交换顺序继续往后比较;
如果左边的数比右边的小,那么右边的数就会去往后继续比较;
这样第一轮比较下来会确定最大的值
第二轮下来确定第二大的值
依次类推…
完成排序
在这里插入图片描述

假设有n个数需要用冒泡排序进行排列如何实现?
分析:
n个数,那么我们需要进行 n-1 轮的比较,因为最后一个数可以不用比较了;
第一轮里面需要比较n-1次(因为假设有n个数,我们从第一个开始的数得跟另外n-1个数进行比较);
往后的每一轮都比前一轮少比较一次(每次比较都确定了一个数,往后的数就少比较一个);
那么我们可以有两层循环,外层循环控制比较的轮数,内层循环控制比较的次数

// 使用冒泡排序将数组进行排序
var arr = [6,8,9,8,5,7,1,3,2]
// 根据刚才的分析,假设这个数组有n个数,其实就是arr.length个数
// 需要进行arr.length-1轮的比较
// 第一轮里面需要比较length-1次
// 往后每一轮都比前一轮少一次,让变量再循环之后--运算
// 外层循环控制比较轮数,从1开始的话就是到length-1
/*  for (var i = 1; i <= arr.length - 1; i++) {

}
*/
// 规范点写我们需要从0开始(做一个合格的程序员,从0开始计算),那么就是到length-2
for (var i = 0; i < arr.length-2; i++) {
    // 内层循环控制比较次数
    // 假设arr.length = 5 ,如下分析
    // arr.length       i       比较次数
    //      5           0           4
    //      5           1           3
    //      5           2           2
    // arr.length       i       arr.length-i-1
    for (var j = 0; j < arr.length - i - 1; j++) {
        // 相邻的两个数进行比较 arr[j]和arr[j+1]进行比较
        if (arr[j] > arr[j+1]){
            // 交换
            var temp = arr[j]
            arr[j] = arr[j+1]
            arr[j+1] = temp
        }
    }
}
console.log(arr)    // [1,2,3,5,6,7,8,8,9]

选择排序
选择排序在排序的过程中他会记录下标;
就是说我们从第一个数开始,以它为基准数,从左往右一个一个去进行比较;
当遇到比自己还小的数,那么就会记录这个数的下标;
当这一轮比较结束,那么久确定了一个最小值的下标;然后将这个最小值跟基准值做交换;
以此类推…
完成排序
在这里插入图片描述

var arr = [3,5,2,7,1,9,4]
// 一共有arr.length个数,那么总的循环轮数:arr.length-1
for (var i = 0; i < arr.length - 1; i++) {
    // 先假设当前最小值的下标为i
    var min = i
    // 用假设的最小值去跟后面的值一一比较
    // 如果遇到后面的值比假设的最小值还要小
    // 那么假设的最小值的下标就应该重新赋值为后面最小值的下标
    // 当一轮下来就可以的得到最小值的索引,这时候再交换

    // 内层循环从i+1开始,每一趟都要比较到最后一个
    for (var j = i + 1; j < arr.length; j++) {
        // 判断arr[min]是否大于arr[j],如果大于了,说明arr[j]才是最小值
        // min就应该重新赋值为j
        if (arr[min] > arr[j]){
            min = j
        }
    }
    // 内层循环结束以后,当前这一轮的最小值就被找到了
    // 让arr[i]和arr[min]交换
    if (i != min) {
        var temp = arr[i]
        arr[i] = arr[min]
        arr[min] = temp
    }
}
console.log(arr)    // [1,2,3,4,5,7,9]
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值