数组的两种排序方:冒泡排序和选择排序

虽然数组排序有sort方法,但是如果数组中是对象的话,sort方法就不适用啦,所有我们就手写一个排序方法。再者,我们不是为了排序而学习,而是为了接触算法而学习,为了锻炼逻辑思路而学习。

一:冒泡排序:两两比较,第一个大于第二个就交换

附上自己画的图片希望小伙伴们更能理解冒泡排序

以上图片,比较的轮数就是外部循环,每轮比较的次数时内循环,话不多说,附上代码:

 1 // 1:冒泡排序两两比较,第一个大于第二个叫交换
 2 
 3   function Arr(arr) {
 4 
 5 ​    // 外循环控制比较的轮数,比较次数是数组的长度减1
 6 
 7 ​    for (var i = 0; i < arr.length - 1; i++) {
 8 
 9 ​      // 内循环控制每轮的比较的次数,比较次数是数组长度减1再减i
10 
11 ​      for (var j = 0; j < arr.length - 1 - i; j++) {
12 
13 ​        if (arr[j] > arr[j + 1]) {
14 
15 ​          // 定义一个临时变量,用来交换使用
16 
17 ​          var ls = arr[j]
18 
19 ​          arr[j] = arr[j + 1]
20 
21 ​          arr[j + 1] = ls
22 
23 ​        }
24 
25 ​      }
26 
27 ​    }
28 
29 ​    return arr;
30 
31   }
32 
33 var arr=[9,5,1,7,2,3,4,6]
34 console.log(Arr(arr))

这个就是冒泡排序啦,当然,理解思路不止这一种哈!

二:选择排序:取出一个,依次和其他比较,找到最小值,之后再交换。交换次数要比冒泡排序少很多,所以,性能更高。

附上我画思路图,希望小伙伴能理解!

以下结构是:比较次数和哪些索引在比较

0-1,0-2,0-3,0-4

1-2,1-3,1-4

2-3,2-4

3-4

 1  var arr = [9,8,5,6,7];
 2     console.log(arr);
 3     for(var i=0;i<arr.length-1;i++){
 4         // 为了能不断的使用第一位和后面的作比较,在能拿到第一个数据的时候,存到一个ls变量中
 5         // 将来使用这个ls变量作比较,就不影响真正的第一位的数据了
 6         // 因为每一行第一个索引都在变,所以,要将这个ls变量,放在第一个循环的内部
 7         var ls = arr[i];
 8         // ls保存了数组中某个数据,lsIndex保存这个数据的索引
 9         var lsIndex = i;
10         for(var j=i+1;j<arr.length;j++){
11             if(ls > arr[j]){
12                 // ls里面的数据如果大了,换成小的
13                 // 因为在找最小的
14                 ls = arr[j];
15                 // 如果ls里面的数据换了,lsIndex也跟着换
16                 lsIndex = j;
17             }
18         }
19         // ls必然已经是最小的了
20         // 交换数组中的数据    
21         // 先把真正的第一位拿走,否则会被覆盖
22         // 放到真正的最小值的位置
23         arr[lsIndex] = arr[i];
24         // 再把ls变量中,最小的值,放在第一位
25         arr[i] = ls;
26     }
27     // 按照从左到右的顺序,依次取出每个数据,后后面所有数据做比较,找到最小值,交换
28     // 选择排序
29     console.log(arr);

猜你喜欢

转载自www.cnblogs.com/Mings-blog/p/12825035.html