冒泡排序&选择排序
冒泡排序
从第一个数开始从左往右,它会把相邻的两个数进行比较;
如果左边的数比右边的数大,那么它就会立即交换顺序继续往后比较;
如果左边的数比右边的小,那么右边的数就会去往后继续比较;
这样第一轮比较下来会确定最大的值
第二轮下来确定第二大的值
依次类推…
完成排序
假设有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]