冒泡排序和数组排序是比较常见的数组排序算法
1.冒泡排序算法:
冒泡排序法是最基本的排序法之一,冒泡排序法的核心思想就是通过循环遍历元素,每次比较的是相邻两项的数,并根据其比较大小的结果调整这两项位置,一次循环之后可以得到当前循环的较大值。经过一轮循环并不能对该数组排序完成,所以我们的数组有多长就要有多少次循环,要在外进行嵌套一次for循环,但这个外循环只是用来控制比较次数的,没有参与实际的比较。
冒泡排序就是让大数上浮,小数下沉,形式就像深海里的泡泡,也因此称之为是冒泡排序。
例如我们有如下数组,使用冒泡排序算法的代码为:
- var arr = [10,5,3,7,9,4,2,8,6];
- // 外循环只是控制循环的次数,没有参与实际意义上的比较
- for(var i = 0; i<arr.length; i++){
- // 每次比较相邻的两项 一轮循环
- for(var j = 0; j<arr.length; j++){
- // 作比较
- if(arr[j] > arr[j+1]){
- // 交换位置
- var temp = arr[j];
- arr[j] = arr[j+1];
- arr[j+1] = temp;
- }
- }
- }
打印结果为:console.log(arr);//[2, 3, 4, 5, 6, 7, 8, 9, 10]
冒泡排序的整体代码已经实现,实际上我们可以对其做一些优化,在内循环的比较时,每一轮循环结束之后,我们都会得到一个较大的值,放在最后边,那么在下次循环进行比较时已经没有和后面的值作比较的意义了,因为也比不过,也不会进行交换位置。因此可以在内循环的结束条件上进行一个优化,让j<arr.length-i;
- // 外循环只是控制循环的次数,没有参与实际意义上的比较
- for(var i = 0; i<arr.length; i++){
- // 每次比较相邻的两项 一轮循环
- for(var j = 0; j<arr.length-i; j++){
- // 作比较(升序排列)
- if(arr[j] > arr[j+1]){
- // 交换位置
- var temp = arr[j];
- arr[j] = arr[j+1];
- arr[j+1] = temp;
- }
- }
- // 一轮循环结束后,得到本轮循环的最大值,放在最后
- }
2. 选择排序的思想是选择第一项,后后面的所有项作比较,比后面的一项大,交换位置,之后选择第二项,后后面的所有项作比较,比后面的一项大(升序排列),交换位置...,以此类推。
也就是从第一项开始,选择该项和后面的所有项进行比较,后面的所有项也需要依次循环,所以在原本的for循环中需要在嵌套一个for循环,在内循环中我们的初始条件为被选中作为比较元素的后一位,即i+1;
例如我们有如下数组,使用选择排序算法的代码为:
- var arr = [10,5,3,7,9,4,2,8,6];
- // 外循环控制作为比较的项
- for(var i = 0; i<arr.length; i++){
- // 内循环依次和后面的项作比较
- for(var j = i+1; j<arr.length; j++){
- // 作比较(升序排列)
- if(arr[i] > arr[j]){
- // 交换位置
- var temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- }
- }
- }
打印结果为: console.log(arr);//[2, 3, 4, 5, 6, 7, 8, 9, 10