一、冒泡排序
相邻的两个单元比较,如果前者数据大,则交换位置(大的放后面)。
需要嵌套两层循环,外层循环根据有多少个数据单元需要比较大小来确定循环次数;
内层循环根据每确定一个数据单元需要多少次比较来确定循环次数。
- 下面是为优化的程序
<script> var arr = [9, 5, 6, 8, 2, 7, 3, 4, 1]; for(var i = 0 ; i < arr.length ; i++){ //外层循环,有length个单元(0~length-1)需要比较 for(var j = 0 ; j < arr.length ; j++){ //内层循环,需要从起始单元比较到最后一个单元 if(arr[j] > arr[j+1]){ //判断是否前者大,前者大进行交换 var middle = 0; middle = arr[j]; arr[j] = arr[j+1]; arr[j+1] = middle; } } } console.log(arr); </script>
- 优化代码
<script> var arr = [9, 5, 6, 8, 2, 7, 3, 4, 1]; for(var i = 0 ; i < arr.length - 1 ; i++){ //有n个单元排序,只需循环(n-1)次,前(n-1)个确定了大小,最后一个便确定了。 for(var j = 0 ; j < arr.length - 1 - i ; j++){ //每次比较中,最后一个需要比较的单元已经在倒数第二个单元的比较中参与了比较,不需要再执行循环比较一次 //上一次循环比较出的最大值(在数组的最后),不用再循环比较了。 if(arr[j] > arr[j+1]){ var middle = 0; middle = arr[j]; arr[j] = arr[j+1]; arr[j+1] = middle; } } } console.log(arr); </script>
两个for循环嵌套可以写成下面这种,效果相同。
for(var i = arr.length - 2 ; i >= 0 ; i--){
for(var j = 0 ; j <= i ; j++){
}
}
二、选择排序
选择最小的数组与参与循环的第一个数值交换位置。
通过保存最小数值的索引,将最小数值与起始位置的数值交换(如果保存的索引与起始位置所以相同,表示起始位置就是最新数值,不需要交换),来实现排序。
- 优化程序
<script> var arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48]; for(i = 0 ; i < arr.length - 1 ; i++){ //n个单元比较(n-1)次 min = i; //默认起始位置下标 //之前比较好的数值,不参加之后的比较 for(j = i+1 ; j < arr.length ; j++){ //从起始位置下一个开始与起始数值比较 if(arr[min] > arr[j]){ //与min中保存的所以对应的最小值比较 min = j; //若min索引保存的数值大,则重新赋值,将当前最小数值对应的索引保存到min中 } } if(min != i){ //比较出的最小数值不在起始位置时,将最小值交换与起始位置交换数值 var middle = 0; middle = arr[min]; arr[min] = arr[i]; arr[i] = middle; } } console.log(arr); </script>
来源:https://www.cnblogs.com/wangjj2/p/12551627.html