虽然数组排序有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);